ホームページ >バックエンド開発 >PHPチュートリアル >PHP ビット演算子
ビット演算子を使用すると、整数内の指定されたビットの評価と操作が可能になります。
example | name | result |
---|---|---|
And(按位与) | 将把 $a 和 $b 中都为 1 的位设为 1。 | |
Or(按位或) | 将把 $a 和 $b 中任何一个为 1 的位设为 1。 | |
Xor(按位异或) | 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。 | |
Not(按位取反) | 将 $a 中为 0 的位设为 1,反之亦然。 | |
Shift left(左移) | 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 | |
は、 | $a と $b のビットをどちらも 1 対 1 に設定します。 |
ディスプレイスメントは、PHP の数学演算です。いずれかの方向に移動されたビットは破棄されます。左にシフトすると、右側にゼロが埋め込まれ、符号ビットが移動されます。これは、符号が保持されないことを意味します。右にシフトすると、左側に符号ビットが埋め込まれます。これは、符号が保持されることを意味します。
希望の優先順位を確保するには括弧を使用します。たとえば、$a & $b == true は最初に比較してからビット単位の AND を実行しますが、($a & $b) == true は最初にビット単位の AND を実行してから比較します。
データ型の変換に注意してください。左引数と右引数の両方が文字列の場合、ビット単位の演算子は文字の ASCII 値を操作します。
PHP 的 ini 设定 error_reporting 使用了按位的值, 提供了关闭某个位的真实例子。要显示除了提示级别 之外的所有错误,php.ini 中是这样用的: <span><codefira mono code pro word-wrap:break-word>E_ALL & ~E_NOTICE</codefira></span>
具体运作方式是先取得 E_ALL 的值: <span>00000000000000000111011111111111</span> 再取得 E_NOTICE 的值: <span>00000000000000000000000000001000</span> 然后通过 <span>~</span> 将其取反: <span>11111111111111111111111111110111</span> 最后再用按位与 AND(&)得到两个值中都设定了(为 1)的位: <span>00000000000000000111011111110111</span>
另外一个方法是用按位异或 XOR(<span>^</span>)来取得只在 其中一个值中设定了的位: <span><codefira mono code pro word-wrap:break-word>E_ALL ^ E_NOTICE</codefira></span>
例 #1 整数の AND、OR、および XOR 演算子
* Ignore the top section,
* it is just formatting to make output clearer.
*/
$format = '(%1d = %1b) = (%2d = %2b)'
. ' %3$s (%4d = %4b)' . "n";
echo --------- --------- -- ---------
result value op test
--------- --------- -- ---------
EOH;
/*
* Here are the examples.
*/
$values = array(0, 1, 2, 4, 8);
$test = 1 + 4;
echo "n Bitwise AND n";
foreach ($values as $value) {
$result = $value & $test;
printf($format, $result, $value, '&', $test);
}
echo "n Bitwise Inclusive OR n";
foreach ($values as $value) {
$result = $value | $test;
printf($format, $result, $value, '|', $test);
}
echo "n Bitwise Exclusive OR (XOR) n";
foreach ($values as $value) {
$result = $value ^ $test;
printf($format, $result, $value, '^', $test);
}
?>
$format
=
'(%1$2d = %1$04b) = (%2$2d = %2$04b)'
"n";
エコー
error_reporting 也可用来演示怎样置位。只显示错误和可恢复 错误的方法是: <span><codefira mono code pro word-wrap:break-word>E_ERROR | E_RECOVERABLE_ERROR</codefira></span>🎜🎜🎜🎜🎜🎜例 #2 文字列 XOR 演算子🎜🎜
echo "12" ^ "9"; // Outputs the Backspace character (ascii 8)
// ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8
echo "hallo" ^ "hello"; // Outputs the ascii values #0 #4 #0 #0 #0
// 'a' ^ 'e' = #4
echo 2 ^ "3"; // Outputs 1
// 2 ^ ((int)"3") == 1
echo "2" ^ 3; // Outputs 1
// ((int)"2") ^ 3 == 1
?>
例 #3 整数の置換
* 例を次に示します。
*/
echo "n--- 正の整数を右にビットシフト ---n";
$val = 4;
$places = 1;
$res = $val >> span>$places;
p($res, span>$val, '>>', $places,'符号ビットのコピーが左側にシフトされました');
$val = 4;
$places = 2 ;
$res = $val >> $places ;
p($res, $val, '>>', $places);
$val = 4;
$places span>= 3;
$res = $ val >> $places;
p($res、$val、'>>'、$places ,'ビットは右側にシフトアウト');
$val = 4;
$places = 4;
$res = $val >> $places;
p($res、$val、'>>'、$places 、 の結果は上記と同じです。0 を超えてシフトすることはできません。);
echo "n- -- 負の整数の右ビットシフト ---n";
$val = -4 ;
$places = 1;
$res = $val >> $places;
p($res、$val、'>>'、$places ,'符号ビットのコピーが左側にシフトされました');
$val = -4;
$places = 2;
$res = $val >> $places;
p($res、$val、'>>'、$places ,'ビットは右側にシフトアウト');
$val = -4;
$places = 3 ;
$res = $val >> $places;
p($res、$val、'>>'、$places 、 の結果は上記と同じです。-1 を超えてシフトすることはできません。);
echo "n --- 正の整数で左ビットシフト ---n";
$val = 4 ;
$places = 1;
$res = $val $places;
p($res, $val, ', $places, 'ゼロを埋める右側') ;
$val = 4;
$places = (PHP_INT_SIZE * 8) - 4;
$res = $val $places;
p($res, $val, ', $places );
$val = 4;
$places = (PHP_INT_SIZE * 8) - 3;
$res = $ヴァル$places;
p($res, $val, ', $places 、のサインビットはシフトアウトされます');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 2 ;
$res = $val $places;
p($res, $val, ', $places 、のビット左側をシフトアウト');
エコー"n--- 負の整数で左ビットシフト ---n";
$val = -4;
$places = 1;
$res = $val $places;
p($res, $val, ', $places 、のゼロ右側に記入してください');
$val = -4;
$places = (PHP_INT_SIZE * 8 ) - 3 ;
$res = $val $places;
p($res, $val, ', $places );
$val = -4;
$places = (PHP_INT_SIZE * 8) - 2 ;
$res = $val $places;
p($res, $val, ', $places 、のビット符号ビットを含む左側をシフトアウトします);
/*
* この下部セクションは無視してください。
* これは、出力を明確にするための単なる書式設定です。
*/
関数 p ( $res、$val、$op、$places、$note = '') {
$形式 = '%0' 。 (PHP_INT_SIZE * 8) 。 「ブン」;
printf("Expression: %d = %d %s %d\n", $res, $val, $op, $places);
echo " Decimal:\n";
printf(" val=%d\n", $val);
printf(" res=%d\n", $res);
echo " Binary:\n";
printf(' val=' . $format, $val);
printf(' res=' . $format, $res);
if ($note) {
echo " NOTE: $note\n";
}
echo "\n";
}
?>
以上例程在 32 位机器上的输出:
--- BIT SHIFT RIGHT ON POSITIVE INTEGERS --- Expression: 2 = 4 >> 1 Decimal: val=4 res=2 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000010 NOTE: copy of sign bit shifted into left side Expression: 1 = 4 >> 2 Decimal: val=4 res=1 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000001 Expression: 0 = 4 >> 3 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: bits shift out right side Expression: 0 = 4 >> 4 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: same result as above; can not shift beyond 0 --- BIT SHIFT RIGHT ON NEGATIVE INTEGERS --- Expression: -2 = -4 >> 1 Decimal: val=-4 res=-2 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111110 NOTE: copy of sign bit shifted into left side Expression: -1 = -4 >> 2 Decimal: val=-4 res=-1 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111111 NOTE: bits shift out right side Expression: -1 = -4 >> 3 Decimal: val=-4 res=-1 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111111 NOTE: same result as above; can not shift beyond -1 --- BIT SHIFT LEFT ON POSITIVE INTEGERS --- Expression: 8 = 4 <p></p><p>以上例程在 64 位机器上的输出:</p><p></p><p></p><pre class="brush:php;toolbar:false">--- BIT SHIFT RIGHT ON POSITIVE INTEGERS --- Expression: 2 = 4 >> 1 Decimal: val=4 res=2 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000010 NOTE: copy of sign bit shifted into left side Expression: 1 = 4 >> 2 Decimal: val=4 res=1 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000001 Expression: 0 = 4 >> 3 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: bits shift out right side Expression: 0 = 4 >> 4 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: same result as above; can not shift beyond 0 --- BIT SHIFT RIGHT ON NEGATIVE INTEGERS --- Expression: -2 = -4 >> 1 Decimal: val=-4 res=-2 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111110 NOTE: copy of sign bit shifted into left side Expression: -1 = -4 >> 2 Decimal: val=-4 res=-1 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 NOTE: bits shift out right side Expression: -1 = -4 >> 3 Decimal: val=-4 res=-1 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 NOTE: same result as above; can not shift beyond -1 --- BIT SHIFT LEFT ON POSITIVE INTEGERS --- Expression: 8 = 4 <p><span>Warning</span></p><p>不要在 32 位系统下向右移超过 32 位。不要在结果可能超过 32 的情况下左移。使用 gmp 扩展对超出 PHP_INT_MAX 的数值来进行位操作。</p><p>参见 <span>pack()</span>,<span>unpack()</span>,<span>gmp_and()</span>,<span>gmp_or()</span>,<span>gmp_xor()</span>,<span>gmp_testbit()</span> 和 <span>gmp_clrbit()</span>。</p><p><span><img src="/static/imghwm/default1.png" data-src="http://image.codes51.com/Article/image/20150824/20150824204951_7209.png?x-oss-process=image/resize,p_40" class="lazy" alt="add a note" style="max-width:90%" style="max-width:90%"> <small>add a note</small></span></p><p>User Contributed Notes <span>43 notes</span></p><p></p><p></p><p></p><p>up</p><p>down</p><div title="87% like this...">46<span><span>wbcarts at juno dot com</span></span> ? <div title="2012-05-17 03:52"> <span>3 years ago</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>カスタム用のビットワイズフラグ PHP オブジェクト<br> 場合によっては、複数のブール値 TRUE または FALSE 値を保持するカスタム PHP オブジェクトが必要になります。それぞれに簡単に変数を含めることもできますが、いつものように、コードはすぐに扱いにくくなる可能性があります。よりインテリジェントなアプローチが常に答えであるように思えます。 最初はやりすぎだと思われる場合は、<br> $flags と呼ばれる単一の整数変数を保持する抽象基本クラスから始めます。この単純な整数には、32 個の TRUE または FALSE のブール値を保持できます。もう 1 つ考慮すべきことは、他の BITS を妨げずに特定の BIT 値を設定することです。 そのため、選択したビットのみを設定する setFlag($flag, $value) 関数がクラス定義に含まれています。抽象基本クラスの定義は次のとおりです: <br><span><?php <br></span><span># BitwiseFlag.php<br></span><span>abstract class </span><span>BitwiseFlag<br></span><span>{<br> protected </span><span>$flags</span><span>;<br> </span><span>/*<br> * 注:これらの関数は、外部コード<br> * が誤って BITS を設定するのを防ぐために保護されています。拡張クラス「User」<br> * がこれをどのように処理するかを見てください。<br> *<br> */<br> </span><span>保護関数 </span><span>isFlagSet</span><span>(</span><span>$flag</span><span>)<br> {<br> return ((</span><span>$this </span><span>-> ;</span><span>フラグ </span><span>& </span><span>$フラグ</span><span>) == </span><span>$flag</span><span>);<br> }<br> 保護された関数 </span><span>setFlag</span><span>(</span><span>$flag</span><span>, </span><span>$value</span><span>)<br> {<br> if(</span><span>) $value</span><span>)<br> {<br> </span><span>$this</span><span>-></span><span>flags </span><span>|= </span><span>$flag</span><span>;<br> }<br> else<br> {<br> </span><span>$this</span><span>-> ;</span><span>フラグ </span><span>&= ~</span><span>$flag</span><span>;<br> }<br> }<br>}<br></span><span>?><br></span><br>上記のクラスは抽象クラスでインスタンス化できないため、拡張機能が必要です。以下は User という単純な拡張機能です -- わかりやすくするために大幅に切り詰められています。 const変数とそれらを使用する方法を定義していることに注意してください。 <br>BitwiseFlag<span><br></span>{<span> const <br></span>FLAG_REGISTERED <span></span>= <span></span>1<span><br>; </span><span>// $flags のビット #1 の値は 1</span> <span></span>const <span><br>FLAG_ACTIVE </span><span>= <br></span>2<span></span>; <span></span>// $flags のビット #2 の値は 2<span> </span><span>const </span><span>FLAG_MEMBER <br></span>= <span></span>4<span></span>; <span></span>// $flags のビット #3 の値は 4<span> </span><span>const </span><span>FLAG_ADMIN <br></span>= <span></span>8<span></span>; <span></span>// $flags のビット #4 の値は 8 です<span> </span><span>public function </span><span>isRegistered<br></span>(){<span> return </span><span>$this</span><span>-></span><span>isFlagSet</span><span>(</span>) <span>自分<br></span>: :<span></span>FLAG_REGISTERED<span></span>);<span> }<br> public function </span><span>isActive</span><span>(){</span> return <span></span>$this<span></span>-><span></span>isFlagSet<span></span>(<span>) </span>自分<span><br>::<br></span>FLAG_ACTIVE<span></span> );<span> }<br> public function </span><span>isMember</span><span>(){</span> return <span></span>$this<span></span>-><span></span>isFlagSet<span></span>(<span></span>self<span><br>::<br></span>FLAG _MEMBER<span></span>);<span> }<br> public function </span><span>isAdmin</span><span>(){</span> return <span></span>$this<span></span>-><span></span>isFlagSet<span></span>(<span></span>self<span><br>::<br></span>FLAG_ADMIN<span></span>);<span> }<br> public function </span><span>setRegistered</span><span> (</span><span>$value</span><span>){</span> <span></span>$this<span></span>-><span></span>setFlag<span><br>(<br></span>self<span></span>::<span></span>FLAG_REGISTERED<span></span>, <span> <br>$値</span><span>);</span> }<br> public function </span><span>setActive</span><span>(</span><span>$value</span><span>){<br> </span><span>$this</span><span>-></span><span>setFlag</span><span>(</span><span>self</span><span>:: </span><span>FLAG_ACTIVE</span><span>、</span><span>$value </span><span>);<br> }<br> public function </span><span>setMember</span><span>(</span><span>$value</span><span>){<br> </span><span>$this</span><span>-></span><span>setFlag</span><span>(</span> <span>自分</span><span>::</span><span>FLAG_MEMBER</span> <span>, </span><span>$value</span><span>);<br> }<br> public function </span><span>setAdmin</span><span>(</span><span>$value</span><span>){<br> </span><span>$this</span><span>-></span><span>setFla g</span><span>(</span><span>自分</span><span> ::</span><span>FLAG_ADMIN</span><span>, </span><span>$value</span><span>);<br> }<br> public function </span><span>__toString</span><span>(){<br> return </span><span>'User [' </span><span>.<br> (</span><span>$this</span><span>-> ;</span><span>は登録されました</span><span>() ? </span><span>「登録済み」 </span><span>: </span><span>''</span><span>) .<br> (</span><span>$this</span><span>-></span><span>はアクティブです</span><span>() ? </span><span>「アクティブ」</span><span>: </span><span>''</span><span>) .<br> (</span><span>$this</span><span>-></span><span>はメンバーです</span><span>() ? </span><span>「メンバー」</span><span>: </span><span>''</span><span>) .<br> (</span><span>$this</span><span>-></span><span>はAdmin</span><span>() ? </span><span>「管理者」</span><span>: </span><span>''</span><span>) .<br> </span><span>']'</span><span>;<br> }<br>}<br></span><span>?><br></span><br>これは大変な作業のように思えますが、多くの問題に対処しました。たとえば、コードの使用と保守は簡単です。フラグ値の取得と設定には意味があります。 User クラスを使用すると、ビット単位のフラグ操作がいかに簡単で直感的であるかがわかります。 become.<br><span><?php <br></span>require(<span></span>'User.php'<span></span>)<span><br></span>$user <span></span>= new <span></span>User<span></span>();<span><br></span>$user<span></span> -> <span></span>setRegistered<span></span>(<span></span>true<span></span>);<span><br></span>$user<span></span>-><span></span>setActive<span></span>(<span></span>true<span></span>);<span><br></span>$ユーザー<span></span>-><span></span>メンバーを設定<span> </span>(<span></span>true<span></span>);<span><br></span>$user<span></span>-><span></span>setAdmin<span></span>(<span></span>true<span></span>);<span>echo <br></span>$user<span></span>; <span></span>// 出力: ユーザー [登録アクティブメンバー管理者]<span><br></span>?><span></span></codefira></p> <p></p> <p>up</p> <p></p>down<p></p>6<div title="100% like this..."> <span>zlel grxnslxves13 at hotmail dot com~=s/x/ee/g<span></span> ? </span><div title="2005-10-26 07:30">9年前<span></span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>エリック・スワンソンのことを指します Perl VS PHP の xor 実装に関する投稿。 <br>実際には、これは XOR の実装に関する問題ではなく、PHP が採用する型負けポリシーに大きく関係しています。 <br> int と float を自由に切り替えることはほとんどの場合に適していますが、値がマシンのワード サイズに近い場合に問題が発生します。つまり、32 ビット マシンでは、0x80000000 付近の値で問題が発生します。これは主に PHP が原因です。 は符号なし整数をサポートしていません。<br>bindec/decbin を使用すると、unsigned-int xor を実行するための回避策としてこの問題に対処できますが、実際の状況は次のとおりです (このコードのパフォーマンスが向上するとは主張していませんが、これはより良い教育的コード):<br><span><?php <br></span><span>function </span><span>unsigned_xor32 </span><span>(</span><span>$a</span><span>, </span><span>$b</span><span>) <br>{<br> </span> <span>$a1 </span><span>= </span><span>$a </span> <span>& </span><span>0x7FFF0000</span><span>;<br> </span><span>$a2 </span><span>= </span><span>$a </span><span>& </span><span>0x0000FFFF</span><span>;<br> </span><span>$a3 </span><span>= </span><span>$a </span><span>& </span><span>0x80000000</span><span>; <br> </span><span>$b1 </span><span>= </span><span>$b </span><span>& </span><span>0x7FFF0000</span><span>;<br> </span><span>$b2 </span><span>= </span> <span>$b </span><span>& </span><span>0x0000FFFF</span><span>;<br> </span><span>$b3 </span><span>= </span><span>$b </span><span>& </span><span>0x80000000</span><span>;<br> </span><span>$c </span><span>= (</span><span>$a3 </span><span>!= </span><span>$b3</span> <span>) ? </span><span>0x80000000 </span><span>: </span><span>0</span><span>;<br> return ((</span><span>$a1 </span><span>^ </span><span>$b1</span><span>) |(</span><span>$a2 </span><span>^ </span><span>$b2</span><span>)) + </span><span>$c</span><span>;<br>}<br></span><span>$x </span><span>= </span><span>3851235679</span><span>;<br></span><span>$y </span><span>= </span><span>43814</span> <span>;<br>エコー</span><span>"<br>これは必要な値"</span><span>;<br>echo </span><span>"<br>3851262585"</span><span>;<br>echo </span><span>"<br>整数値に対するネイティブ XOR 演算の結果は、符号付き整数として扱われます。"</span><span>; <br>echo </span><span>"<br>"</span><span>.(</span><span>$x </span><span>^ </span><span>$y</span><span>);<br>echo </span><span>"<br>したがって、MSBを個別に実行します"</span><span>;<br>eチョー</span><span>"<br>"</span><span>.</span><span>unsigned_xor32</span><span>(</span><span>$x</span><span>, </span><span>$y</span><span>);<br></span><span>?><br></span><br>これ本当に基礎的なことですが、それらのために大学時代にこれを見逃した人は、ここに 2 の補数に関する何かがあるようです: <br>http://www.evergreen.edu/biophysics/technotes/program/2s_comp.htm</span></codefira></p> <p></p> <p></p> <p>up</p> <p>down </p> <div title="100% like this...">3<span><span>たるみ ichドットネット</span></span> で? <div title="2013-07-14 06:52"> <span>2年前</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>ビットごとの再実装 NOT (~)<br> protected function flipBin($number) {<br> $bin = str_pad(base_convert($number, 10, 2), 32, 0, STR_PAD_LEFT);<br> for ($i = 0; $i switch ($bin{$i}) {<br> case '0' :<br> $bin{$i} = '1';<br> ブレーク;<br> case '1' :<br> $bin{$i} = '0';<br> Break;<br> }<br> }<br> return binding($bin);<br> }<br>利点は、MAX_INT より大きい数値でも動作することです</span></codefira></p> <p></p> <p></p> <p>アップ</p> <p>ダウン</p> <div title="100% like this...">3<span><span>ヴィベカナンド dot pathak25 at gmail dot com</span></span> ? <div title="2013-03-16 07:59"> <span>2 年前</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>$a = 9;<br>$b = 10;<br>echo $a & $b;<br>place value 128 64 32 16 8 4 2 1<br>$a 0 0 0 0 1 0 0 1 =9<br>$b 0 0 0 0 1 0 1 0 =10<br>result 8 <br>only bit they share together is the 8 bit. So 8 gets returned.<br> $a = 36;<br>$b = 103;<br>echo $a & $b;<br>place value 128 64 32 16 8 4 2 1<br>$a 0 0 1 0 0 1 0 0 =36<br>$b 0 1 1 0 0 1 1 1 =103<br>result 32+4 = 36<br>the only bits these two share together are the bits 32 and 4 which when added together return 36.<br>$a = 9;<br>$b = 10;<br>echo $a | $b;<br>place value 128 64 32 16 8 4 2 1<br>$a 0 0 0 0 1 0 0 1 =9<br>$b 0 0 0 0 1 0 1 0 =10<br>result 8+2+1 = 11<br>3 bits set, in the 8, 2, and 1 column.add those up 8+2+1 and you get 11<br>$a = 9;<br>$b = 10;<br>echo $a ^ $b;<br>place value 128 64 32 16 8 4 2 1<br>$a 0 0 0 0 1 0 0 1 =9<br>$b 0 0 0 0 1 0 1 0 =10<br>result 2+1 = 3<br>the 2 bit and the 1 bit that they each have set but don't share. Soooo 2+1 = 3</span>$a = 9;</codefira></p>$b = 10;echo $a & $b;位の値 128 64 32 16 8 4 2 1<p>$a 0 0 0 0 1 0 0 1 =9</p> <p>$b 0 0 0 0 1 0 1 0 =10</p> <p>結果 8 </p>一緒に共有するビットは 8 ビットだけです。したがって、8 が返されます。<p> $a = 36;</p>$b = 103;<div title="100% like this...">echo $a & $b;place value 128 64 32 16 8 4 2 1$a 0 0 1 0 0 1 0 0 =36<span> $b 0 1 1 0 0 1 1 1 =103<span>結果 32+4 = 36</span>これら 2 つが共有するビットは 32 と 4 だけで、合計すると 36 が返されます。</span>$a = 9;<div title="2012-12-14 03:15">$b = 10;<span>エコー $a | $b;</span>位の値 128 64 32 16 8 4 2 1$a 0 0 0 0 1 0 0 1 =9<p>$b 0 0 0 0 1 0 1 0 =10</p> <p>結果 8+2+1 = 11<codefira mono code pro word-wrap:break-word display:block> 8、2、1 列に 3 ビットが設定されています。これらを 8+2+1 に加算すると 11 になります<span>$a = 9;<br>$b = 10;<br>echo $a ^ $b;</span>place value 128 64 32 16 8 4 2 1$a 0 0 0 0 1 0 0 1 =9</codefira></p>$b 0 0 0 0 1 0 1 0 =10結果 2+1 = 3その2ビットと1ビットそれぞれ設定されていますが、共有されていません。すごい 2+1 = 3<p></p> <p></p> <p></p> <p></p> <div title="100% like this...">上<span>下<span></span>3</span><div title="2009-04-15 02:22"> <span></span>エリッチ シーチャワイ・ドットコム🎜 で? 🎜🎜2年前🎜🎜🎜🎜🎜🎜ネガティブなことについてのメモ ドキュメントに記載されているように、シフト値は整数の 2 による乗算または除算 (左または右) です。つまり、負のシフト値 (右側のオペランド) はシフトの符号に影響し、シフトの方向には影響しません。私は...するだろう 期待している。 🎜フェ。 0xff >> -2 は 0x0 🎜 および 0xff <p><codefira mono code pro word-wrap:break-word display:block><span>お探しの方へ 負の値で動作する PHP の循環ビット シフト関数 (特に暗号関数に便利) について、私が書いた小さな関数を以下に示します:<br>(注: これを負の $num 値で動作させるまでにほぼ丸一日かかりました) (なぜうまくいくときとうまくいかないときがあるのかわかりませんでした)。PHP には算術演算のみがあり、私が慣れ親しんでいる論理的なビット単位の右シフト (0x80000001>>16) がないからです。 予想どおり、「0000 0000 0000 0000 1000 0000 0000 0000」ではなく、「1111 1111 1111 1111 1000 0000 0000 0000」を(バイナリで)出力します。これを修正するには、オフセットより 1 つ少ない右シフト 0x7FFFFFFF に等しいマスクを (ビットごとの & によって) 適用する必要があります。 )<br><span><?php <br></span><span>function </span><span>circular_shift</span><span>(</span><span>$num</span><span>,</span><span>$offset</span><span>) { </span><span>//非破壊循環ビット単位シフトを実行します。オフセットの場合は正のシフト、負の場合は右シフトします<br> </span><span>$num</span><span>=(int)</span><span>$num</span><span>;<br> </span><span>$mask</span><span>=</span><span> 0x7fffffff</span><span>; </span><span>//マスク PHP は算術右シフトのみを実行し、論理的ではないという事実に対応するため、つまり、PHP は負の値を右シフトするときに期待される出力を提供しません<br> </span><span>if (</span><span>$offset</span><span>></span><span>0</span><span>) {<br> </span><span>$num</span><span>=(</span><span>$num</span><span><span>$offset</span><span>%</span><span>32</span><span>) | ((</span><span>$num</span><span>>>(</span><span>32</span><span>-</span><span>$offset</span><span>%</span><span>32</span><span>)) & (</span><span>$mask</span><span>>>(</span><span>31</span><span>-</span><span>$offset</span><span>%</span><span>32</span><span>)));<br> }<br> elseif (</span><span>$offset </span><span><span> 0</span><span>){<br> </span><span>$offset</span><span>=</span><span>abs</span><span>(</span><span>$offset</span><span>);<br> </span><span>$num</span><span>=((</span> <span>$num</span><span>>></span><span>$オフセット</span><span>%</span><span>32</span><span>) & (</span><span>$マスク</span><span>>>(-</span><span>1</span><span>+</span><span>$offset</span><span>%</span><span>32</span><span>))) | ($ $num</span><span>&lt;&lt;(</span><span>32</span><span>-</span><span>$offset</span><span>%</span><span>32</span><span>); </span>}<span><br><br>?></span><span></span><span><br><br></span><span></span>上</span>下</span></span></codefira></p>3<p></p> <p></p> <p>m0sh hotmail ドットコム</p> <p> で? </p> <div title="100% like this...">7年前<p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>@greenone - 素晴らしい機能です。 ありがとう。キーの使用法に合わせて調整しました:<br><span><?php <br></span><span>function </span><span>bitxor</span><span>(</span><span>$str</span><span>, </span><span>$key</span><span>) {<br> </span><span>$xorWidth </span><span>= </span><span>PHP_INT_SIZE</span><span>*</span><span>8</span><span>;<br> </span><span>// 分割<br> </span><span>$o1 </span><span>= </span><span>str_split</span><span>(</span><span>$str</span><span>, </span><span> $xorWidth</span><span>);<br> </span><span>$o2 </span><span>= </span><span>str_split</span><span>(</span><span>str_pad</span><span>(</span><span>''</span><span>, </span><span>strlen</span>) <span>(</span><span>$str</span><span>)、</span><span>$ key</span><span>)、</span><span>$xorWidth</span><span>);<br> </span><span>$res </span><span>= </span><span>''</span><span>;<br> </span><span>$runs </span><span>= </span><span>count </span><span>(</span><span>$o1</span><span>); <br> for(</span><span>$i</span><span>=</span><span>0</span><span>;</span><span>$i</span><span><span>$runs</span><span>;</span><span>$i</span><span>++)<br> </span><span>$res </span><span>.= </span> <span>decbin</span><span>(</span><span>bindec</span><span>(</span><span>$o1</span><span>[</span><span>$i</span><span>]) ^ </span><span>bindec</span><span>(</span><span>$o2</span><span>[</span><span>$i</span><span>])); <br> return </span><span>$res</span><span>;<br>}<br></span><span>?></span></span></span></codefira></p> <p></p> <p></p> <p>上</p> <p>下</p> <div title="100% like this...">3<span><span>Eリック スワンソン</span></span> ? <div title="2005-08-31 05:19"> <span>9年前</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>PerlとPHPの実装 ^ 演算子の説明:<br> Perl モジュールを PHP に変換しようとした後、Perl の ^ 演算子の実装が PHP の実装とは異なることに気付きました。 デフォルトでは、Perl は変数を浮動小数点として扱い、PHP は整数として扱います。 PHPの使用を確認できました 「整数を使用する」と演算子を指定します。 Perl モジュール内では、PHP が使用していたものとまったく同じ結果が出力されます。<br> PHP で ^ 演算子を使用する場合、論理的な決定は、すべての変数を (float) としてキャストすることです。 ただし、これでは同じ結果は得られません。 30分ほど壁に頭をぶつけ続けた後、宝石を発見し、 PHP での 2 進数と 10 進数の変換<br>/*<br> ビット単位の演算の経験があまりないので、これが最良の解決策であるとは言えませんが、最終的には確実に機能し、常に Perl が提供するのとまったく同じ結果を返す解決策であることは確かです。<br> */<br>function binxor($a, $b) {<br> return binding(decbin((float)$a ^ (float)$b));<br>}<br>//通常の PHP コードでは Perl と同じ結果は得られません<br> $結果 = 3851235679 ^ 43814; //= -443704711<br>//Perl と同じ結果を取得するには<br>$result = binxor(3851235679, 43814); //= 3851262585<br>//YIPPEE!!!<br>//違いを確認するには、次のことを試してください<br>$a = 3851235679 XOR 43814;<br>$b = 3851235679 ^ 43814; //整数の結果<br>$c = (float)3851235679 ^ (float)43814; // $b<br>$d = binxor(3851235679, 43814) と同じ; //Perlと同じ!!<br>echo("A: $a<br>");<br>echo("B: $b<br>");<br>echo("C: $c<br>");<br>echo("D: $d<br>");</span></codefira></p> <p></p> <p></p> <p>上</p> <p>下</p> <div title="91% like this...">10<span><span>グレイダ DONTSPAM dot Solidinc dot org の dot NOSPAM</span></span> ? <div title="2009-06-03 08:48"> <span>6年前</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>最初に、ビットマスキングを見つけました 混乱を招く概念であり、使い道がありませんでした。そこで、他の人が混乱している場合に備えて、次のコード スニペットを作成しました:<br><span><?php <br> </span><span>// 車両が持つことができるさまざまな詳細<br> </span><span>$hasFourWheels </span><span>= </span><span>1</span><span>;<br> </span> <span>$hasTwoWheels </span><span>= </span><span>2</span><span>;<br> </span><span>$hasDoors </span><span>= </span><span>4</span><span>;<br> </span><span>$hasRedColour </span><span>= </span><span>8</span><span>;<br> </span><span>$bike </span><span>= </span><span> $hasTwoWheels</span><span>;<br> </span><span>$golfBuggy </span><span>= </span><span>$hasFourWheels</span><span>;<br> </span><span>$ford </span><span>= </span> <span>$には4つの車輪があります</span><span>| </span><span>$hasDoors</span><span>;<br> </span><span>$ferrari </span><span>= </span><span>$hasFourWheels </span><span>| </span><span>$ドアあり</span><span>| </span><span>$は赤い色</span><span>;<br> </span><span>$はBike </span><span>= </span><span>$はFourWheels </span><span>& </span><span>$bike</span><span>; </span><span># $bike には 4 つの車輪がないため、誤りです<br> </span><span>$isGolfBuggy </span><span>= </span><span>$hasFourWheels </span><span>& </span><span>$golfBuggy</span><span>; </span><span># 確かに、$golfBuggy には 4 つの車輪があるからです<br> </span><span>$isFord </span><span>= </span><span>$hasFourWheels </span><span>& </span><span>$ford</span><span>; </span><span># $ford $hasFourWheels<br></span><span>?><br></span><br>そして、これを多くのものに適用できます。たとえば、security:<br><span><?php <br> </span><span>// Security Permissions:<br> </span><span>$ writePost </span><span>= </span><span>1</span><span>;<br> </span><span>$readPost </span><span>= </span><span>2</span><span>;<br> </span><span>$deletePost </span><span>= </span><span>4 </span><span>;<br> </span><span>$addUser </span><span>= </span><span>8</span> <span>;<br> </span><span>$deleteUser </span><span>= </span><span>16</span><span>;<br> <br> </span><span>// ユーザーグループ:<br> </span><span>$administrator </span><span>= </span> <span>$write投稿</span><span>| </span><span>$read投稿 </span><span>| </span><span>$投稿を削除 </span><span>| </span><span>$addUser </span><span>| </span><span>$deleteUser</span><span>;<br> </span><span>$moderator </span><span>= </span><span>$readPost </span><span>| </span><span>$投稿を削除</span><span>| </span><span>$deleteUser</span><span>;<br> </span><span>$writer </span><span>= </span><span>$writePost </span><span>| </span><span>$readPost</span><span>;<br> </span><span>$guest </span><span>= </span><span>$readPost</span><span>;<br> </span><span>// 許可をチェックする関数<br> </span><span>関数 </span><span>checkPerミッション</span><span>(</span><span>$user</span><span>, </span> <span>$許可</span><span>) {<br> if(</span><span>$user </span><span>& </span><span>$permission</span><span>) {<br> return </span><span>true</span><span>;<br> } else {<br> return </span><span>false</span><span>;<br> }<br> }<br> </span> <span>// これですべてを適用します!<br> </span><span>if(</span><span>checkPermission</span><span>(</span><span> $administrator</span><span>, </span><span>$deleteUser</span><span>)) {<br> </span><span>deleteUser</span><span>(</span><span>「いくつか User"</span><span>); </span><span># $administrator が $deleteUser できるため実行されます<br> </span><span>}<br></span><span>?><br></span><br>一度覚えてしまえば、とても便利です!問題を避けるために、各値を 2 の累乗で増やすことを忘れないでください</span></codefira></p> <p></p> <p></p> <p>up</p> <p>down</p> <div title="87% like this...">6<span><span>ivoras Gmail ドットコム</span></span> で? <div title="2011-06-06 04:44"> <span>4年前</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>追加の好奇心として、 何らかの理由で、演算 (「18」と「32」) の結果は「10」になります。言い換えれば、文字列に対して二項演算子の使用を避けてみてください:)</span></codefira></p> <p></p> <p></p> <p>up</p> <p>down</p> <div title="85% like this...">10<span><span></span></span>? <div title="2005-03-04 03:13"> <span>10年前</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>実践的なビット演算子 case :<br><span><?php <br> </span><span>// この色の赤、緑、青の値を知りたいです :<br> </span><span>$color </span><span>= </span><span>0xFEA946 </span><span>;<br> </span><span>$red </span><span>= </span><span>$color </span><span>>> </span><span>16 </span><span>;<br> </span><span>$green</span><span>= (</span><span>$color </span><span>& </span><span>0x00FF00</span><span>) >> </span><span>8 </span><span>;<br> </span><span>$blue </span><span>= </span><span>$color </span><span>& </span><span>0x0000FF </span><span>;<br> </span><span>printf</span><span>( </span><span>「レッド」 : %X (%d)、緑 : %X (%d)、青 : %X (%d)'</span><span>,<br> </span><span>$red</span><span>, </span><span>$red</span><span>, </span><span>$green</span><span> 、</span><span>$グリーン</span><span>、</span><span>$ブルー</span><span>、</span><span>$ブルー</span><span>) ;<br> </span><span>// 表示されます...<br> // 赤 : FE (254)、緑 : A9 (169)、青 : 46 (70)<br></span><span>?></span></span></codefira></p> <p></p> <p></p> <p>up </p> <p>ダウン</p> <div title="83% like this...">4<span><span>zooly globmi ドットコム</span></span> で? <div title="2009-10-19 07:52"> <span>5 年前</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>これはビットごとの例です leftrotate と rightrotate。<br>この関数は 10 進数でのみ機能することに注意してください。他の型は Pack() で変換できます。<br><span><?php <br></span><span>function </span><span>rotate </span><span>( </span><span>$decmal</span><span>, </span><span> $bits</span><span>) {<br> </span><span>$binary </span><span>= </span><span>decbin</span><span>(</span><span>$10進数</span><span>);<br> return (<br> </span><span>bindec</span><span>(</span><span>substr</span><span>( </span><span>$バイナリ</span><span>、</span><span>$ビット</span><span>).</span><span>substr</span><span>(</span><span>$binary</span><span>, </span><span>0</span><span>, </span><span>$bits</span><span>))<br> );<br>}<br></span><span>// 1を回転24 (1111100) を左に1 ビット<br></span><span>echo </span><span>rotate</span><span>(</span><span>124</span><span>, </span><span>1</span><span>);<br></span><span>// = 121 (1111001)<br>// 124 回転 (111) 1100) 3ビットで右へ<br> </span><span>エコー</span><span>回転</span><span>(</span><span>124</span><span>, -</span><span>3</span><span>);<br></span><span>// = 79 (1001111)<br></span><span>?></span></span></codefira></p> <p></p> <p></p> <p>上</p> <p>下</p> <div title="80% like this...">3 <span><span>ジョシュ joshstrike ドットコム</span></span> で? <div title="2011-02-11 07:54"> <span>4年前</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>これをさらに参照するには 何よりも自分自身...長さ $bits のマスクで $n 個のフラグが 1 に設定されているすべての可能なバイナリの組み合わせを反復処理する必要がある場合: <br><span><?php <br></span><span>echo </span><span>masksOf</span><span>( </span><span>3</span><span>、</span><span>10</span><span>); <br>関数</span><span>マスクOf</span><span>(</span><span>$n</span><span>,</span><span>$bits</span><span>) { <br> </span><span>$u </span><span>= </span><span>pow</span><span>(</span><span>2</span><span>,</span><span>$bits</span><span>)-</span><span>1</span><span>; </span><span>//スタート 値、フルフラグがオン。 <br> </span><span>$マスク </span><span>= array(); <br> その間 (</span><span>$u</span><span>></span><span>0</span><span>) { <br> </span><span>$z </span><span>= </span><span>numflags</span><span>(</span><span>$u</span><span>); <br> if (</span><span>$z</span><span>==</span><span>$n</span><span>) </span><span>array_push</span><span>(</span><span>$masks</span><span>,</span><span>$u</span><span>); <br> </span><span>$u</span><span>--; <br> } <br> return (</span><span>$マスク</span><span>); <br>} <br>関数 </span><span>numflags</span><span>(</span><span>$n</span><span>) { <br> </span><span>$k </span><span>= </span><span>0</span><span>; <br> while (</span><span>$n</span><span>) { <br> </span><span>$k </span><span>+= </span><span>$n </span><span>& </span><span>1</span><span>; <br> </span><span>$n </span><span>= </span><span>$n </span><span>>> </span><span>1</span><span>; <br> } <br> return (</span><span>$k</span><span>); <br></span><span>// 代わりに: <br>// $u = 0; <br>// for ($k=1;$k// $u+=($n&$k?1:0); <br>// } <br>// return ($u); <br></span><span>} <br></span><span>?></span></span></codefira></p> <p></p> <p></p> <p>上</p> <p>下</p> <div title="75% like this...">4<span><span>スペンサー・P・モイ 例のドットコム</span></span> で? <div title="2011-09-17 06:21"> <span>3 年前</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>NOT または補数演算子 ( ~ ) と負の 2 進数は混乱を招く可能性があります。<br>~2 = -3 という公式を使用するためです ~x = -x - 1 10 進数のビット単位の補数は、数値から 1 を引いた値の否定です。<br>注: を使用するだけです。以下の例では 4 ビットですが、実際には PHP は 32 ビットを使用します。<br>負の 10 進数 (例: -3) を 2 進数に変換するには 3 つの手順が必要です:<br>1) 10 進数の正の値を 2 進数 (例: 3) に変換します。 = 0011)<br>2) ビットを反転します (例: 0011 が 1100 になります)<br>3) 1 を加算します (例: 1100 + 0001 = 1101)<br> 1101 = -3 がどのように計算されるのか疑問に思われるかもしれません。 PHP は、負の 2 進数をレンダリングするために「2 の補数」というメソッドを使用します。左端のビットが 1 の場合、2 進数は負であるため、ビットを反転して 1 を加算します。0 の場合、それは正であるため、加算しません。 何でもしなければなりません。したがって、0010 は正の 2 になります。1101 の場合は負なので、ビットを反転すると 0010 が得られます。1 を加算すると、-3 に等しい 0011 が得られます。 4</span></codefira></p>シルバー<p> ? </p> <p></p> <p>6ね</p> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div>