PHP のビット演算は PHP ではあまり使用されませんが、非常に便利です。PHP のビット演算の使い方を紹介します。
$a & $b and(ビット単位の AND)
$a | $b または (ビットごとの OR)
$a ^ $b Xor (ビットごとの XOR)
~$a Not(ビット単位ではありません)
$a << $b 左にシフト
$a >> $b 右にシフト(右にシフト)
詳しい説明
$a & $b のビットごとの AND は、$a と $b の両方とも 1 から 1 のビットを設定します。
例: 10 & 12 = 8
10 1010
12 1100
1000 8
$a | $b ビットごとの OR は $a または $b を 1 に設定します。
例: 10 | 12 = 14
10 1010
12 1100
1110 14
$a ^ $b ビットごとの XOR
例: 10^12
10 1010
12 1100
0110 6
~ビット単位の表記法は、$a の 0 を 1 に設定し、1 を 0 に設定します
例: ~10 =
10 1010 11111111111111111111111111111111111111111111111111111110101 -11
$a << $b 左シフト $a を左に $b 回移動します (各移動は 2 を乗算することを意味します);
例: 1 << 10 = 1024
1(1) 10 ビット左シフト 10000000000(1024)
1*2 の 10 乗に相当します。PHP にべき乗演算がないのは本当に残念です。
$a >> $b 右シフト $a を右に $b 回移動します (各移動は 2 で割ることを意味します);
例: 1024
10000000000(1024)を右に2桁シフトすると、100000000(256)になります
PHP は $a & $b および (ビット単位の AND) $a $b | (ビット単位の OR) $a ^ $b Xor (ビット単位の排他的 OR) ~ $a Not (ビット単位の否定) $a < です。 b 左にシフト(左にシフト)$a >> $b 右にシフト(右にシフト)
$a と $b のビットごとの AND の詳細な説明 $a と $b の両方のビットを 1 に設定します。例: 10 & 12 = 810 101012 1100 1000 8
$a | $b ビットごとの OR は、$a または $b のいずれかを 1 に設定します: 10 | 12 = 1410 101012 1100 1110 14
$a ^ $b ビットごとの XOR の例: 10 ^ 1210 101012 1100 0110 6
~ビット単位の表記は、$a の 0 を 1 に設定し、1 を 0 に設定します。 例: ~10 = 10 1010 11111111111111111111111111111111111111111111111111111110101 -11
$a
$a >> $b 右シフトは $a の値を右に $b 回移動します (各移動は 2 で割ることを意味します) 例: 1024
フラグビットフィールドとビット演算子の組み合わせ
PHPのerror_reportingのパラメータ値一覧
値定数
1 E_エラー
4 E_PARSE
8 E_お知らせ
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_エラー
512 E_USER_警告
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT
4096 E_RECOVERABLE_ERROR
value の値がすべてジャンプしており、すべて 2 の n+1 乗であることがわかりました。
値定数
0000 0001 E_エラー
0000 0010 E_警告
0000 0100 E_PARSE
0000 1000 E_通知
0001 0000 E_CORE_ERROR
0010 0000 E_CORE_WARNING
.
.
.
...一度加算される累乗ごとに、2 進法に 1 桁が加算されます (コンピューターを勉強したことのあるほとんどの人はこれを知っています:)...)
注: 各オプションはビットに対応します (1 はオン、0 はオフを意味します)
それでは、このようにパラメータを設定する利点を見てみましょう。
error_reporting(3);//decbin(3) == 0000 0011; (E_WARNING および E_ERROR の設定と同等)
error_reporting(4);//decbin(4) == 0000 0100; (E_PARSE の設定と同等)
error_reporting(5);//decbin(5) == 0000 0101; (E_PARSE および E_ERROR の設定と同等)
設定を取得:
項目がオンになっているかどうかの判定は、ビット演算(& - "AND"ルール: 1がすべて1、そうでない場合は0)を使用して取得できます
//E_PARSE
if($n & 4){
//E_PARSE がオンになっています
// 2 進数 4 は 0100 です。3 番目のビットだけが 1 なので、「&」演算が実行されると、他のすべての位置は 0 に設定されます
//つまり、$n の 3 番目のビットも 1 である場合にのみ、結果が 0 より大きくなります。
//4(0100),5(0101),6(0110),7(0111)など
}その他{
//E_PARSE 閉じる
// 3 番目のビットは 0 で、このオプションが閉じられていることを意味します
}
設定を変更します: ($nは現在の10進数値を表します)
以下の使用法を参照してください。
//E_PARSE 項目を閉じ、「&」「AND」ルールを使用します
$n = $n&(8192-4-1);
//なぜ 8191 を使用するのでしょうか?
//これはオプションの数に関係します。このエラー表示マークは合計 13 ビットを使用します (4096 は 2 進数で 13 ビット)、8192 は (14 ビット) です。
//なぜ 4 を引いて 1 を引くのでしょうか?
//8192-4-1=8187。 (1111111111011) 2 進数は 13 桁で、使用する最大桁数と同じです。そして、3 番目のビットの対応する値は 0 です。
//この数値を使用して、1 から 4096 までの任意の数値とビットごとの AND 演算を実行します。0 に設定される 3 番目のビットを除いて、他のビットの値は変更されません? 「AND」ルール :)
//同様にE_WARNINGをOFFにしたい
//$n = $n&(8192-2-1);
//E_PARSE 項目を有効にするには、「|」または「or」ルールを使用します
$n = $n|4;
//上記の終わりを読んだ後、それを開くことについていくつかのアイデアが浮かぶかもしれません:)
// '|' — 「OR」ルール: 1 がある場合は 1、それ以外の場合は 0 です
//上記は、すべてのビットが 1 の場合、他のビットには影響しません。今度は、すべてのビットが 0 の場合、他のビットには影響しません:)
//したがって、後続のオペランドのバイナリ ビットの対応する値を 1 に設定するだけでよく、他のすべてのビットを 0 に設定しても問題ありません。
//見つけましたか?これは、それぞれの設定項目に対応する 10 進数値です:)
それがアイデアです。複数のビットの設定値を同時に操作したい場合は、オペランドの設定方法によって異なります。
将来開発する際に、1 つのパラメータで複数のオプションを同時に設定する必要がある場合は、この方法を検討できます:)