Home Backend Development PHP Tutorial PHP bitwise operators

PHP bitwise operators

Jul 30, 2016 pm 01:30 PM
function nbsp quot the

Bitwise operators allow evaluation and manipulation of specified bits in integers.

bit operators
example name result
$a & $b</codefira></span></td> <td>And (bitwise AND) </td> <td>will put <var>$a</var> Bits that are both 1 in and <var>$b</var> are set to 1. </td> </tr> <tr> <td><span><codefira mono code pro word-wrap:break-word>$a | $b</codefira></span></td> <td>Or (bitwise OR) </td> <td> will set any bit of <var>$a</var> and <var>$b</var> to 1. </td> </tr> <tr> <td><span><codefira mono code pro word-wrap:break-word>$a ^ $b</codefira></span></td> <td> </td> <td> <var></var><var></var>~ $a</td> </tr> <tr> <td>Not (bitwise negation) <span><codefira mono code pro word-wrap:break-word> Set the bits that are 0 in $a</codefira></span> to 1, and vice versa. </td> <td></td> <td> <var></var>$a << to 2"). </td></tr><tr><td><span><codeFira Mono','Source Code Pro',monospace; word-wrap:break-word">$a > to 2").

Displacement is a mathematical operation in PHP. Bits moved out in any direction are discarded. When shifting left, the right side is padded with zeros, and the sign bit is moved away, meaning that the sign is not preserved. When shifting right, the left side is padded with sign bits, which means the sign is preserved.

Use parentheses to ensure the desired priority. For example $a & $b == true compares first and then performs bitwise AND; while ($a & $b) == true performs bitwise AND first and then compares.

Pay attention to data type conversion. If both left and right arguments are strings, the bitwise operators operate on the ASCII values ​​of the characters.

PHP 的 ini 设定 error_reporting 使用了按位的&#20540;,
提供了关闭某个位的真实例子。要显示除了提示级别
之外的所有错误,php.ini 中是这样用的:
<span><codeFira Mono','Source Code Pro',monospace; word-wrap:break-word">E_ALL & ~E_NOTICE</code></span>
Copy after login
Copy after login
具体运作方式是先取得 E_ALL 的&#20540;:
<span>00000000000000000111011111111111</span>
再取得 E_NOTICE 的&#20540;:
<span>00000000000000000000000000001000</span>
然后通过 <span>~</span> 将其取反:
<span>11111111111111111111111111110111</span>
最后再用按位与 AND(&)得到两个&#20540;中都设定了(为 1)的位:
<span>00000000000000000111011111110111</span>
Copy after login
Copy after login
另外一个方法是用按位异或 XOR(<span>^</span>)来取得只在
其中一个&#20540;中设定了的位:
<span><codeFira Mono','Source Code Pro',monospace; word-wrap:break-word">E_ALL ^ E_NOTICE</code></span>
Copy after login
Copy after login

error_reporting 也可用来演示怎样置位。只显示错误和可恢复
错误的方法是:
<span><codeFira Mono','Source Code Pro',monospace; word-wrap:break-word">E_ERROR | E_RECOVERABLE_ERROR</code></span>
Copy after login
Copy after login
也就是将 E_ERROR
<span>00000000000000000000000000000001</span>
和 E_RECOVERABLE_ERROR
<span>00000000000000000001000000000000</span>
用按位或 OR(<span>|</span>)运算符来取得在任何一个&#20540;中被置位的结果:
<span>00000000000000000001000000000001</span>
Copy after login
Copy after login

Example #1 Integer AND, OR and the top section, * it is just formatting to make output clearer.

*/

$format <span><span>= <br></span>'(%1$2d = %1$04b) = (%2$2d = %2$04b)'<span> <br><br>. <br> <br>' %3$s (%4$2d = %4$04b)' </span><span>. </span><span>"n"</span><span>;<br>echo <<<EOH</span><span></span> --------- ---------                                                                                                                                                                                                                                                                                 . -----<span></span><span>EOH;</span><span></span>/*<span> * Here are the examples.<br> */<br></span><span>$values ​​<br><br>= array(<br></span>0<span><br>, </span><span>1<br><br>, <br></span>2 <span></span>, <span></span>4<span></span>, <span></span>8<span></span>);<span></span><span>$test </span><span>= </span><span>1 </span><span>+ </span><span>4</span><span>;<br>echo</span> <span>"n Bitwise AND n"</span><span>;</span> foreach (<span></span>$values ​​<span></span>as <span></span>$value<span><br>) {</span> <span></span>$result <span><br>= </span><span>$value </span><span>& </span><span>$test</span><span>; <br> ​ </span><span>printf</span><span>(</span><span>$format </span><span>, </span><span>$result</span><span>, <br></span>$value<span></span>, <span></span>'&'<span></span>, <span></span>$test<span></span>);<span>}</span>echo <span></span>"n Bitwise Inclusive OR n"<span></span>;<span> foreach (</span><span>$values ​​</span><span>as </span><span>$value<br><br>) {</span> <span></span>$result <span><br>= </span><span>$value </span><span>| </span><span>$test</span><span>; <br> ​ </span><span>printf</span><span>(</span><span>$format </span><span>, </span><span>$result</span><span>, <br></span>$value<span></span>, <span></span>'|'<span></span>, <span></span>$test<span></span>);<span>}</span>echo <span></span>"n Bitwise Exclusive OR (XOR) n"<span> </span>;<span>foreach (</span><span>$values ​​</span><span>as </span><span>$value<br><br>) {</span> <span></span>$result <span><br>= </span><span>$value </span><span>^ </span><span>$test </span><span>;<br>​​ </span><span>printf</span><span>(</span> <span>$format</span><span>, </span><span>$result</span><span>, <br></span>$value<span></span>, <span></span>'^'<span></span>, <span></span>$test<span></span>);<span>}</span><span></span>?&g t;<span></span><span></span><span></span> <span>The above routine will output: </span><span><br><br><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> --------- --------- -- --------- result value op test --------- --------- -- --------- Bitwise AND ( 0 = 0000) = ( 0 = 0000) &amp; ( 5 = 0101) ( 1 = 0001) = ( 1 = 0001) &amp; ( 5 = 0101) ( 0 = 0000) = ( 2 = 0010) &amp; ( 5 = 0101) ( 4 = 0100) = ( 4 = 0100) &amp; ( 5 = 0101) ( 0 = 0000) = ( 8 = 1000) &amp; ( 5 = 0101) Bitwise Inclusive OR ( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101) ( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101) ( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101) (13 = 1101) = ( 8 = 1000) | ( 5 = 0101) Bitwise Exclusive OR (XOR) ( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101) ( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101) ( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101) (13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101) </pre><div class="contentsignin">Copy after login</div></div><div class="contentsignin">Copy after login</div></div></span><span></span></span>

Example #2 XOR operator of string

<span><span><?php<br></span><span>echo </span><span>12 </span><span>^ </span><span>9</span><span>; </span><span>// Outputs '5'<br></span><span>echo </span><span>"12" </span><span>^ </span><span>"9"</span><span>; </span><span>// Outputs the Backspace character (ascii 8)<br>                 // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8<br></span><span>echo </span><span>"hallo" </span><span>^ </span><span>"hello"</span><span>; </span><span>// Outputs the ascii values #0 #4 #0 #0 #0<br>                        // 'a' ^ 'e' = #4<br></span><span>echo </span><span>2 </span><span>^ </span><span>"3"</span><span>; </span><span>// Outputs 1<br>              // 2 ^ ((int)"3") == 1<br></span><span>echo </span><span>"2" </span><span>^ </span><span>3</span><span>; </span><span>// Outputs 1<br>              // ((int)"2") ^ 3 == 1<br></span><span>?>><p></p> <p><span>Example #3 整数的位移</span></p> <p></p> <p><codefira mono code pro word-wrap:break-word display:block><span><span><?php<br></span><span>/*<br> * Here are the examples.<br> */<br></span><span>echo </span><span>"n--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---n"</span><span>;<br></span><span>$val </span><span>= </span><span>4</span><span>;<br></span><span>$places </span><span>= </span><span>1</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span>>> </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'>>'</span><span>, </span><span>$places</span><span>, </span><span>'copy of sign bit shifted into left side'</span><span>);<br></span><span>$val </span><span>= </span><span>4</span><span>;<br></span><span>$places </span><span>= </span><span>2</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span>>> </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'>>'</span><span>, </span><span>$places</span><span>);<br></span><span>$val </span><span>= </span><span>4</span><span>;<br></span><span>$places </span><span>= </span><span>3</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span>>> </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'>>'</span><span>, </span><span>$places</span><span>, </span><span>'bits shift out right side'</span><span>);<br></span><span>$val </span><span>= </span><span>4</span><span>;<br></span><span>$places </span><span>= </span><span>4</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span>>> </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'>>'</span><span>, </span><span>$places</span><span>, </span><span>'same result as above; can not shift beyond 0'</span><span>);<br>echo </span><span>"n--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---n"</span><span>;<br></span><span>$val </span><span>= -</span><span>4</span><span>;<br></span><span>$places </span><span>= </span><span>1</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span>>> </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'>>'</span><span>, </span><span>$places</span><span>, </span><span>'copy of sign bit shifted into left side'</span><span>);<br></span><span>$val </span><span>= -</span><span>4</span><span>;<br></span><span>$places </span><span>= </span><span>2</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span>>> </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'>>'</span><span>, </span><span>$places</span><span>, </span><span>'bits shift out right side'</span><span>);<br></span><span>$val </span><span>= -</span><span>4</span><span>;<br></span><span>$places </span><span>= </span><span>3</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span>>> </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'>>'</span><span>, </span><span>$places</span><span>, </span><span>'same result as above; can not shift beyond -1'</span><span>);<br>echo </span><span>"n--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---n"</span><span>;<br></span><span>$val </span><span>= </span><span>4</span><span>;<br></span><span>$places </span><span>= </span><span>1</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span><< </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'<<'</span><span>, </span><span>$places</span><span>, </span><span>'zeros fill in right side'</span><span>);<br></span><span>$val </span><span>= </span><span>4</span><span>;<br></span><span>$places </span><span>= (</span><span>PHP_INT_SIZE </span><span>* </span><span>8</span><span>) - </span><span>4</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span><< </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'<<'</span><span>, </span><span>$places</span><span>);<br></span><span>$val </span><span>= </span><span>4</span><span>;<br></span><span>$places </span><span>= (</span><span>PHP_INT_SIZE </span><span>* </span><span>8</span><span>) - </span><span>3</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span><< </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'<<'</span><span>, </span><span>$places</span><span>, </span><span>'sign bits get shifted out'</span><span>);<br></span><span>$val </span><span>= </span><span>4</span><span>;<br></span><span>$places </span><span>= (</span><span>PHP_INT_SIZE </span><span>* </span><span>8</span><span>) - </span><span>2</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span><< </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'<<'</span><span>, </span><span>$places</span><span>, </span><span>'bits shift out left side'</span><span>);<br>echo </span><span>"n--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---n"</span><span>;<br></span><span>$val </span><span>= -</span><span>4</span><span>;<br></span><span>$places </span><span>= </span><span>1</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span><< </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'<<'</span><span>, </span><span>$places</span><span>, </span><span>'zeros fill in right side'</span><span>);<br></span><span>$val </span><span>= -</span><span>4</span><span>;<br></span><span>$places </span><span>= (</span><span>PHP_INT_SIZE </span><span>* </span><span>8</span><span>) - </span><span>3</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span><< </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'<<'</span><span>, </span><span>$places</span><span>);<br></span><span>$val </span><span>= -</span><span>4</span><span>;<br></span><span>$places </span><span>= (</span><span>PHP_INT_SIZE </span><span>* </span><span>8</span><span>) - </span><span>2</span><span>;<br></span><span>$res </span><span>= </span><span>$val </span><span><< </span><span>$places</span><span>;<br></span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>'<<'</span><span>, </span><span>$places</span><span>, </span><span>'bits shift out left side, including sign bit'</span><span>);<br></span><span>/*<br> * Ignore this bottom section,<br> * it is just formatting to make output clearer.<br> */<br></span><span>function </span><span>p</span><span>(</span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>$op</span><span>, </span><span>$places</span><span>, </span><span>$note </span><span>= </span><span>''</span><span>) {<br>    </span><span>$format </span><span>= </span><span>'%0' </span><span>. (</span><span>PHP_INT_SIZE </span><span>* </span><span>8</span><span>) . </span><span>"bn"</span><span>;<br> </span><span>printf</span><span>(</span><span>"Expression: %d = %d %s %d\n"</span><span>, </span><span>$res</span><span>, </span><span>$val</span><span>, </span><span>$op</span><span>, </span><span>$places</span><span>);<br> echo </span><span>" Decimal:\n"</span><span>;<br> </span><span>printf</span><span>(</span><span>" val=%d\n"</span><span>, </span><span>$val</span><span>);<br> </span><span>printf</span><span>(</span><span>" res=%d\n"</span><span>, </span><span>$res</span><span>);<br> echo </span><span>" Binary:\n"</span><span>;<br> </span><span>printf</span><span>(</span><span>' val=' </span><span>. </span><span>$format</span><span>, </span><span>$val</span><span>);<br> </span><span>printf</span><span>(</span><span>' res=' </span><span>. </span><span>$format</span><span>, </span><span>$res</span><span>);<br> if (</span><span>$note</span><span>) {<br> echo </span><span>" NOTE: </span><span>$note</span><span>\n"</span><span>;<br> }<br> echo </span><span>"\n"</span><span>;<br>}<br></span><span>?></span></span></codefira></p> <p></p> <p>以上例程在 32 位机器上的输出:</p> <p></p> <p></p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">--- BIT SHIFT RIGHT ON POSITIVE INTEGERS --- Expression: 2 = 4 &gt;&gt; 1 Decimal: val=4 res=2 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000010 NOTE: copy of sign bit shifted into left side Expression: 1 = 4 &gt;&gt; 2 Decimal: val=4 res=1 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000001 Expression: 0 = 4 &gt;&gt; 3 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: bits shift out right side Expression: 0 = 4 &gt;&gt; 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 &gt;&gt; 1 Decimal: val=-4 res=-2 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111110 NOTE: copy of sign bit shifted into left side Expression: -1 = -4 &gt;&gt; 2 Decimal: val=-4 res=-1 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111111 NOTE: bits shift out right side Expression: -1 = -4 &gt;&gt; 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 &lt;&lt; 1 Decimal: val=4 res=8 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000001000 NOTE: zeros fill in right side Expression: 1073741824 = 4 &lt;&lt; 28 Decimal: val=4 res=1073741824 Binary: val=00000000000000000000000000000100 res=01000000000000000000000000000000 Expression: -2147483648 = 4 &lt;&lt; 29 Decimal: val=4 res=-2147483648 Binary: val=00000000000000000000000000000100 res=10000000000000000000000000000000 NOTE: sign bits get shifted out Expression: 0 = 4 &lt;&lt; 30 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: bits shift out left side --- BIT SHIFT LEFT ON NEGATIVE INTEGERS --- Expression: -8 = -4 &lt;&lt; 1 Decimal: val=-4 res=-8 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111000 NOTE: zeros fill in right side Expression: -2147483648 = -4 &lt;&lt; 29 Decimal: val=-4 res=-2147483648 Binary: val=11111111111111111111111111111100 res=10000000000000000000000000000000 Expression: 0 = -4 &lt;&lt; 30 Decimal: val=-4 res=0 Binary: val=11111111111111111111111111111100 res=00000000000000000000000000000000 NOTE: bits shift out left side, including sign bit </pre><div class="contentsignin">Copy after login</div></div></p></p><p><p>以上例程在 64 位机器上的输出:</p></p><p><p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">--- BIT SHIFT RIGHT ON POSITIVE INTEGERS --- Expression: 2 = 4 &gt;&gt; 1 Decimal: val=4 res=2 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000010 NOTE: copy of sign bit shifted into left side Expression: 1 = 4 &gt;&gt; 2 Decimal: val=4 res=1 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000001 Expression: 0 = 4 &gt;&gt; 3 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: bits shift out right side Expression: 0 = 4 &gt;&gt; 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 &gt;&gt; 1 Decimal: val=-4 res=-2 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111110 NOTE: copy of sign bit shifted into left side Expression: -1 = -4 &gt;&gt; 2 Decimal: val=-4 res=-1 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 NOTE: bits shift out right side Expression: -1 = -4 &gt;&gt; 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 &lt;&lt; 1 Decimal: val=4 res=8 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000001000 NOTE: zeros fill in right side Expression: 4611686018427387904 = 4 &lt;&lt; 60 Decimal: val=4 res=4611686018427387904 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0100000000000000000000000000000000000000000000000000000000000000 Expression: -9223372036854775808 = 4 &lt;&lt; 61 Decimal: val=4 res=-9223372036854775808 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=1000000000000000000000000000000000000000000000000000000000000000 NOTE: sign bits get shifted out Expression: 0 = 4 &lt;&lt; 62 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: bits shift out left side --- BIT SHIFT LEFT ON NEGATIVE INTEGERS --- Expression: -8 = -4 &lt;&lt; 1 Decimal: val=-4 res=-8 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111000 NOTE: zeros fill in right side Expression: -9223372036854775808 = -4 &lt;&lt; 61 Decimal: val=-4 res=-9223372036854775808 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1000000000000000000000000000000000000000000000000000000000000000 Expression: 0 = -4 &lt;&lt; 62 Decimal: val=-4 res=0 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: bits shift out left side, including sign bit </pre><div class="contentsignin">Copy after login</div></div></p></p></p><p><span>Warning</span><p>不要在 32 位系统下向右移超过 32 位。不要在结果可能超过 32 的情况下左移。使用 gmp 扩展对超出 PHP_INT_MAX 的数&#20540;来进行位操作。</p></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><p><span><img src="/static/imghw/default1.png" data-src="http://image.codes51.com/Article/image/20150824/20150824204951_7209.png" class="lazy" alt="add a note" style="max-width:90%" style="max-width:90%"> <small>add a note</small></span><p>User Contributed Notes <span>43 notes</span></p></p><p><p><p><p>up</p><p>down</p><div title="87% like this...">46</p></p><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','Source Code Pro',monospace; word-wrap:break-word; display:block"><span>BITWISE FLAGS for Custom PHP Objects<br>Sometimes I need a custom PHP Object that holds several boolean TRUE or FALSE values. I could easily include a variable for each of them, but as always, code has a way to get unweildy pretty fast. A more intelligent approach always seems to be the answer, even if it seems to be overkill at first.<br>I start with an abstract base class which will hold a single integer variable called $flags. This simple integer can hold 32 TRUE or FALSE boolean values. Another thing to consider is to just set certain BIT values without disturbing any of the other BITS -- so included in the class definition is the setFlag($flag, $value) function, which will set only the chosen bit. Here's the abstract base class definition: <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>   * Note: these functions are protected to prevent outside code<br>   * from falsely setting BITS. See how the extending class 'User'<br>   * handles this.<br>   *<br>   */<br>  </span><span>protected function </span><span>isFlagSet</span><span>(</span><span>$flag</span><span>)<br>  {<br>    return ((</span><span>$this</span><span>-><span>flags </span><span>& </span><span>$flag</span><span>) == </span><span>$flag</span><span>);<br>  }<br>  protected function </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>flags </span><span>&= ~</span><span>$flag</span><span>;<br>    }<br>  }<br>}<br></span><span>?><br></span><br>The class above is abstract and cannot be instantiated, so an extension is required. Below is a simple extension called User -- which is severely truncated for clarity. Notice I am defining const variables AND methods to use them.<br><span><?php<br></span><span># User.php<br></span><span>require(</span><span>'BitwiseFlag.php'</span><span>);<br>class </span><span>User </span><span>extends </span><span>BitwiseFlag<br></span><span>{<br>  const </span><span>FLAG_REGISTERED </span><span>= </span><span>1</span><span>; </span><span>// BIT #1 of $flags has the value 1<br>  </span><span>const </span><span>FLAG_ACTIVE </span><span>= </span><span>2</span><span>;     </span><span>// BIT #2 of $flags has the value 2<br>  </span><span>const </span><span>FLAG_MEMBER </span><span>= </span><span>4</span><span>;     </span><span>// BIT #3 of $flags has the value 4<br>  </span><span>const </span><span>FLAG_ADMIN </span><span>= </span><span>8</span><span>;      </span><span>// BIT #4 of $flags has the value 8<br>  </span><span>public function </span><span>isRegistered</span><span>(){<br>    return </span><span>$this</span><span>-></span><span>isFlagSet</span><span>(</span><span>self</span><span>::</span><span>FLAG_REGISTERED</span><span>);<br>  }<br>  public function </span><span>isActive</span><span>(){<br>    return </span><span>$this</span><span>-></span><span>isFlagSet</span><span>(</span><span>self</span><span>::</span><span>FLAG_ACTIVE</span><span>);<br>  }<br>  public function </span><span>isMember</span><span>(){<br>    return </span><span>$this</span><span>-></span><span>isFlagSet</span><span>(</span><span>self</span><span>::</span><span>FLAG_MEMBER</span><span>);<br>  }<br>  public function </span><span>isAdmin</span><span>(){<br>    return </span><span>$this</span><span>-></span><span>isFlagSet</span><span>(</span><span>self</span><span>::</span><span>FLAG_ADMIN</span><span>);<br>  }<br>  public function </span><span>setRegistered</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_REGISTERED</span><span>, </span><span>$value</span><span>);<br>  }<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>self</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>setFlag</span><span>(</span><span>self</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>isRegistered</span><span>() ? </span><span>'REGISTERED' </span><span>: </span><span>''</span><span>) .<br>      (</span><span>$this</span><span>-></span><span>isActive</span><span>() ? </span><span>' ACTIVE' </span><span>: </span><span>''</span><span>) .<br>      (</span><span>$this</span><span>-></span><span>isMember</span><span>() ? </span><span>' MEMBER' </span><span>: </span><span>''</span><span>) .<br>      (</span><span>$this</span><span>-></span><span>isAdmin</span><span>() ? </span><span>' ADMIN' </span><span>: </span><span>''</span><span>) .<br>    </span><span>']'</span><span>;<br>  }<br>}<br></span><span>?><br></span><br>This seems like a lot of work, but we have addressed many issues, for example, using and maintaining the code is easy, and the getting and setting of flag values make sense. With the User class, you can now see how easy and intuitive bitwise flag operations become.<br><span><?php<br></span><span>require(</span><span>'User.php'</span><span>)<br></span><span>$user </span><span>= new </span><span>User</span><span>();<br></span><span>$user</span><span>-></span><span>setRegistered</span><span>(</span><span>true</span><span>);<br></span><span>$user</span><span>-></span><span>setActive</span><span>(</span><span>true</span><span>);<br></span><span>$user</span><span>-></span><span>setMember</span><span>(</span><span>true</span><span>);<br></span><span>$user</span><span>-></span><span>setAdmin</span><span>(</span><span>true</span><span>);<br>echo </span><span>$user</span><span>;  </span><span>// outputs: User [REGISTERED ACTIVE MEMBER ADMIN]<br></span><span>?></span><p></p><p></p><p>up</p><p>down</p><div title="100% like this...">6<span><span>zlel grxnslxves13 at hotmail dot com~=s/x/ee/g</span></span> ? <div title="2005-10-26 07:30"> <span>9 years ago</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>I refer to Eric Swanson's post on Perl VS PHP's implementation of xor. <br>Actually, this is not an issue with the implementation of XOR,  but a lot more to do with the lose-typing policy that PHP adopts. <br>Freely switching between int and float is good for most cases, but problems happen when your value is near the word size of your machine. Which is to say, 32-bit machines will encounter problems with values that hover around 0x80000000 - primarily because PHP does not support unsigned integers.<br>using bindec/decbin would address this issue as a work-around to do unsigned-int xor, but here's the real picture (i'm not claiming that this code will perform better, but this would be a better pedagogical code):<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>echo </span><span>"<br>This is the value we want"</span><span>;<br>echo </span><span>"<br>3851262585"</span><span>;<br>echo </span><span>"<br>The result of a native xor operation on integer values is treated as a signed integer"</span><span>;<br>echo </span><span>"<br>"</span><span>.(</span><span>$x </span><span>^ </span><span>$y</span><span>);<br>echo </span><span>"<br>We therefore perform the MSB separately"</span><span>;<br>echo </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>This is really foundation stuff, but for those of you who missed this in college, there seems to be something on 2's complement here: <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>sag at ich dot net</span></span> ? <div title="2013-07-14 06:52"> <span>2 years ago</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>me reimplement for bitwise 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 < 32; $i++) {<br>            switch ($bin{$i}) {<br>                case '0' :<br>                    $bin{$i} = '1';<br>                    break;<br>                case '1' :<br>                    $bin{$i} = '0';<br>                    break;<br>            }<br>        }<br>        return bindec($bin);<br>    }<br>the benefit is, it works with numbers greater MAX_INT</span>

up

down

3

vivekanand dot pathak25 at gmail dot com ?
2 years ago

<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>

up

down

3

erich at seachawaii dot com ?
2 years ago

<span>Just a note regarding negative shift values, as the documentation states each shift is an integer multiply or divide (left or right respectively) by 2.  That means a negative shift value (the right hand operand) effects the sign of the shift and NOT the direction of the shift as I would have expected.  <br>FE. 0xff >> -2 results in 0x0 <br>and 0xff << -2 result in 0xFFFFFFFFC0000000 (dependant on PHP_INT_MAX)</span>

up

down

4

cw3theophilus at gmail dot com ?
6 years ago

<span>For those who are looking for a circular bit shift function in PHP (especially useful for cryptographic functions) that works with negtive values, here is a little function I wrote:<br>(Note: It took me almost a whole day to get this to work with negative $num values (I couldn't figure out why it sometimes worked and other times didn't), because PHP only has an arithmatic and not a logical bitwise right shift like I am used to. I.e. 0x80000001>>16 will ouputs (in binary) "1111 1111 1111 1111 1000 0000 0000 0000" instead of "0000 0000 0000 0000 1000 0000 0000 0000" like you would expect. To fix this you have to apply the mask (by bitwise &) equal to 0x7FFFFFFF right shifted one less than the offset you are shifting by.)<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>//Do a nondestructive circular bitwise shift, if offset positive shift left, if negative shift right<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>//Mask to cater for the fact that PHP only does arithmatic right shifts and not logical i.e. PHP doesn't give expected output when right shifting negative values<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><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><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>$offset</span><span>%</span><span>32</span><span>) & (</span><span>$mask</span><span>>>(-</span><span>1</span><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>));<br>    }<br>    return </span><span>$num</span><span>; <br>}<br></span><span>?></span></span></codefira></p> <p></p> <p></p> <p>up</p> <p>down</p> <div title="100% like this...">3<span><span>m0sh at hotmail dot com</span></span> ? <div title="2008-08-07 12:03"> <span>7 years ago</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>@greenone - nice function, thanks. I've adapted it for key usage:<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>// split<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><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></codefira></p> <p></p> <p></p> <p>up</p> <p>down</p> <div title="100% like this...">3<span><span>Eric Swanson</span></span> ? <div title="2005-08-31 05:19"> <span>9 years ago</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>Perl vs. PHP implementation of the ^ operator:<br>After attempting to translate a Perl module into PHP, I realized that Perl's implementation of the ^ operator is different than the PHP implementation.  By default, Perl treats the variables as floats and PHP as integers.  I was able to verify the PHP use of the operator by stating "use integer;" within the Perl module, which output the exact same result as PHP was using.<br>The logical decision would be to cast every variable as (float) when using the ^ operator in PHP.  However, this will not yield the same results.  After about a half hour of banging my head against the wall, I discovered a gem and wrote a function using the binary-decimal conversions in PHP.<br>/*<br>not having much experience with bitwise operations, I cannot tell you that this is the BEST solution, but it certainly is a solution that finally works and always returns the EXACT same result Perl provides.<br>*/<br>function binxor($a, $b) {<br>    return bindec(decbin((float)$a ^ (float)$b));<br>}<br>//normal PHP code will not yeild the same result as Perl<br>$result = 3851235679 ^ 43814; //= -443704711<br>//to get the same result as Perl<br>$result = binxor(3851235679, 43814); //= 3851262585<br>//YIPPEE!!!<br>//to see the differences, try the following<br>$a = 3851235679 XOR 43814;<br>$b = 3851235679 ^ 43814; //integer result<br>$c = (float)3851235679 ^ (float)43814; //same as $b<br>$d = binxor(3851235679, 43814); //same as 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>up</p> <p>down</p> <div title="91% like this...">10<span><span>grayda dot NOSPAM at DONTSPAM dot solidinc dot org</span></span> ? <div title="2009-06-03 08:48"> <span>6 years ago</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>Initially, I found bitmasking to be a confusing concept and found no use for it. So I've whipped up this code snippet in case anyone else is confused:<br><span><?php<br>    </span><span>// The various details a vehicle can have<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>$hasFourWheels </span><span>| </span><span>$hasDoors</span><span>;<br>    </span><span>$ferrari       </span><span>= </span><span>$hasFourWheels </span><span>| </span><span>$hasDoors </span><span>| </span><span>$hasRedColour</span><span>;<br>    </span><span>$isBike        </span><span>= </span><span>$hasFourWheels </span><span>& </span><span>$bike</span><span>; </span><span># False, because $bike doens't have four wheels<br>    </span><span>$isGolfBuggy   </span><span>= </span><span>$hasFourWheels </span><span>& </span><span>$golfBuggy</span><span>; </span><span># True, because $golfBuggy has four wheels<br>    </span><span>$isFord        </span><span>= </span><span>$hasFourWheels </span><span>& </span><span>$ford</span><span>; </span><span># True, because $ford $hasFourWheels<br></span><span>?><br></span><br>And you can apply this to a lot of things, for example, 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>// User groups:<br>    </span><span>$administrator </span><span>= </span><span>$writePost </span><span>| </span><span>$readPosts </span><span>| </span><span>$deletePosts </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>$deletePost </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>// function to check for permission<br>    </span><span>function </span><span>checkPermission</span><span>(</span><span>$user</span><span>, </span><span>$permission</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>// Now we apply all of this!<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>"Some User"</span><span>); </span><span># This is executed because $administrator can $deleteUser<br>    </span><span>}<br></span><span>?><br></span><br>Once you get your head around it, it's VERY useful! Just remember to raise each value by the power of two to avoid problems</span></codefira></p> <p></p> <p></p> <p>up</p> <p>down</p> <div title="87% like this...">6<span><span>ivoras at gmail dot com</span></span> ? <div title="2011-06-06 04:44"> <span>4 years ago</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>As an additional curiosity, for some reason the result of the operation ("18" & "32") is "10". In other words, try avoiding using the binary operators on strings :)</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 years ago</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>A bitwise operators practical case :<br><span><?php<br>    </span><span>// We want to know the red, green and blue values of this color :<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>'Red : %X (%d), Green : %X (%d), Blue : %X (%d)'</span><span>,<br>        </span><span>$red</span><span>, </span><span>$red</span><span>, </span><span>$green</span><span>, </span><span>$green</span><span>, </span><span>$blue</span><span>, </span><span>$blue</span><span>) ;<br>    </span><span>// Will display...<br>    // Red : FE (254), Green : A9 (169), Blue : 46 (70)<br></span><span>?></span></span></codefira></p> <p></p> <p></p> <p>up</p> <p>down</p> <div title="83% like this...">4<span><span>zooly at globmi dot com</span></span> ? <div title="2009-10-19 07:52"> <span>5 years ago</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>Here is an example for bitwise leftrotate and rightrotate.<br>Note that this function works only with decimal numbers - other types can be converted with pack().<br><span><?php<br></span><span>function </span><span>rotate </span><span>( </span><span>$decimal</span><span>, </span><span>$bits</span><span>) {<br>  </span><span>$binary </span><span>= </span><span>decbin</span><span>(</span><span>$decimal</span><span>);<br>  return (<br>    </span><span>bindec</span><span>(</span><span>substr</span><span>(</span><span>$binary</span><span>, </span><span>$bits</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>// Rotate 124 (1111100) to the left with 1 bits<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>// Rotate 124 (1111100) to the right with 3 bits<br></span><span>echo </span><span>rotate</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>up</p> <p>down</p> <div title="80% like this...">3<span><span>josh at joshstrike dot com</span></span> ? <div title="2011-02-11 07:54"> <span>4 years ago</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>More referencing this for myself than anything... if you need to iterate through every possible binary combination where $n number of flags are set to 1 in a mask of $bits length: <br><span><?php <br></span><span>echo </span><span>masksOf</span><span>(</span><span>3</span><span>,</span><span>10</span><span>); <br>function </span><span>masksOf</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>//start value, full flags on. <br>    </span><span>$masks </span><span>= array(); <br>    while (</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>$masks</span><span>);    <br>} <br>function </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>//    alternately: <br>//    $u = 0; <br>//    for ($k=1;$k<=$n;$k*=2) { <br>//        $u+=($n&$k?1:0); <br>//    } <br>//    return ($u); <br></span><span>} <br></span><span>?></span></span></codefira></p> <p></p> <p></p> <p>up</p> <p>down</p> <div title="75% like this...">4<span><span>spencer-p-moy at example dot com</span></span> ? <div title="2011-09-17 06:21"> <span>3 years ago</span><p></p> <p><codefira mono code pro word-wrap:break-word display:block><span>The NOT or complement operator ( ~ ) and negative binary numbers can be confusing.<br>~2 = -3  because you use the formula  ~x = -x - 1  The bitwise complement of a decimal number is the negation of the number minus 1.<br>NOTE: just using 4 bits here for the examples below but in reality PHP uses 32 bits.<br>Converting a negative decimal number (ie: -3) into binary takes 3 steps:<br>1) convert the positive version of the decimal number into binary (ie: 3 = 0011)<br>2) flips the bits (ie: 0011 becomes 1100)<br>3) add 1 (ie: 1100  + 0001 = 1101)<br>You might be wondering how does 1101 = -3. Well PHP uses the method "2's complement" to render negative binary numbers. If the left most bit is a 1 then the binary number is negative and you flip the bits and add 1. If it is 0 then it is positive and you don't have to do anything. So 0010 would be a positive 2. If it is 1101, it is negative and you flip the bits to get 0010. Add 1 and you get 0011 which equals -3.</span></codefira></p> <p></p> <p></p> <p>up</p> <p>down</p> <div title="75% like this...">4<span><span>Silver</span></span> ? <div title="2009-05-12 04:36"><span>6 ye</span></div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div></pre></< to 2"). </td></tr><tr><td><span><codeFira Mono','Source Code Pro',monospace; word-wrap:break-word">$a > to 2").

Displacement is a mathematical operation in PHP. Bits moved out in any direction are discarded. When shifting left, the right side is padded with zeros, and the sign bit is moved away, meaning that the sign is not preserved. When shifting right, the left side is padded with sign bits, which means the sign is preserved.

Use parentheses to ensure the desired priority. For example $a & $b == true compares first and then performs bitwise AND; while ($a & $b) == true performs bitwise AND first and then compares.

Pay attention to data type conversion. If both left and right arguments are strings, the bitwise operators operate on the ASCII values ​​of the characters.

PHP 的 ini 设定 error_reporting 使用了按位的&#20540;,
提供了关闭某个位的真实例子。要显示除了提示级别
之外的所有错误,php.ini 中是这样用的:
<span><codeFira Mono','Source Code Pro',monospace; word-wrap:break-word">E_ALL & ~E_NOTICE</code></span>
Copy after login
Copy after login
具体运作方式是先取得 E_ALL 的&#20540;:
<span>00000000000000000111011111111111</span>
再取得 E_NOTICE 的&#20540;:
<span>00000000000000000000000000001000</span>
然后通过 <span>~</span> 将其取反:
<span>11111111111111111111111111110111</span>
最后再用按位与 AND(&)得到两个&#20540;中都设定了(为 1)的位:
<span>00000000000000000111011111110111</span>
Copy after login
Copy after login
另外一个方法是用按位异或 XOR(<span>^</span>)来取得只在
其中一个&#20540;中设定了的位:
<span><codeFira Mono','Source Code Pro',monospace; word-wrap:break-word">E_ALL ^ E_NOTICE</code></span>
Copy after login
Copy after login

error_reporting 也可用来演示怎样置位。只显示错误和可恢复
错误的方法是:
<span><codeFira Mono','Source Code Pro',monospace; word-wrap:break-word">E_ERROR | E_RECOVERABLE_ERROR</code></span>
Copy after login
Copy after login
也就是将 E_ERROR
<span>00000000000000000000000000000001</span>
和 E_RECOVERABLE_ERROR
<span>00000000000000000001000000000000</span>
用按位或 OR(<span>|</span>)运算符来取得在任何一个&#20540;中被置位的结果:
<span>00000000000000000001000000000001</span>
Copy after login
Copy after login

Example #1 Integer AND, OR and the top section, * it is just formatting to make output clearer.

*/

$format <span><span>= <br></span>'(%1$2d = %1$04b) = (%2$2d = %2$04b)'<span> <br><br>. <br> <br>' %3$s (%4$2d = %4$04b)' </span><span>. </span><span>"n"</span><span>;<br>echo <<<EOH</span><span></span> --------- ---------                                                                                                                                                                                                                                                                                 . -----<span></span><span>EOH;</span><span></span>/*<span> * Here are the examples.<br> */<br></span><span>$values ​​<br><br>= array(<br></span>0<span><br>, </span><span>1<br><br>, <br></span>2 <span></span>, <span></span>4<span></span>, <span></span>8<span></span>);<span></span><span>$test </span><span>= </span><span>1 </span><span>+ </span><span>4</span><span>;<br>echo</span> <span>"n Bitwise AND n"</span><span>;</span> foreach (<span></span>$values ​​<span></span>as <span></span>$value<span><br>) {</span> <span></span>$result <span><br>= </span><span>$value </span><span>& </span><span>$test</span><span>; <br> ​ </span><span>printf</span><span>(</span><span>$format </span><span>, </span><span>$result</span><span>, <br></span>$value<span></span>, <span></span>'&'<span></span>, <span></span>$test<span></span>);<span>}</span>echo <span></span>"n Bitwise Inclusive OR n"<span></span>;<span> foreach (</span><span>$values ​​</span><span>as </span><span>$value<br><br>) {</span> <span></span>$result <span><br>= </span><span>$value </span><span>| </span><span>$test</span><span>; <br> ​ </span><span>printf</span><span>(</span><span>$format </span><span>, </span><span>$result</span><span>, <br></span>$value<span></span>, <span></span>'|'<span></span>, <span></span>$test<span></span>);<span>}</span>echo <span></span>"n Bitwise Exclusive OR (XOR) n"<span> </span>;<span>foreach (</span><span>$values ​​</span><span>as </span><span>$value<br><br>) {</span> <span></span>$result <span><br>= </span><span>$value </span><span>^ </span><span>$test </span><span>;<br>​​ </span><span>printf</span><span>(</span> <span>$format</span><span>, </span><span>$result</span><span>, <br></span>$value<span></span>, <span></span>'^'<span></span>, <span></span>$test<span></span>);<span>}</span><span></span>?&g t;<span></span><span></span><span></span> <span>The above routine will output: </span><span><br><br><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> --------- --------- -- --------- result value op test --------- --------- -- --------- Bitwise AND ( 0 = 0000) = ( 0 = 0000) &amp; ( 5 = 0101) ( 1 = 0001) = ( 1 = 0001) &amp; ( 5 = 0101) ( 0 = 0000) = ( 2 = 0010) &amp; ( 5 = 0101) ( 4 = 0100) = ( 4 = 0100) &amp; ( 5 = 0101) ( 0 = 0000) = ( 8 = 1000) &amp; ( 5 = 0101) Bitwise Inclusive OR ( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101) ( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101) ( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101) (13 = 1101) = ( 8 = 1000) | ( 5 = 0101) Bitwise Exclusive OR (XOR) ( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101) ( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101) ( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101) (13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101) </pre><div class="contentsignin">Copy after login</div></div><div class="contentsignin">Copy after login</div></div></span><span></span></span>

Example #2 XOR operator of string

echo 12 9// Outputs '5'
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 "3"// Outputs 1
              // 2 ^ ((int)"3") == 1
echo "2" 3// Outputs 1
              // ((int)"2") ^ 3 == 1
?>>

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Solution: Your organization requires you to change your PIN Solution: Your organization requires you to change your PIN Oct 04, 2023 pm 05:45 PM

The message "Your organization has asked you to change your PIN" will appear on the login screen. This happens when the PIN expiration limit is reached on a computer using organization-based account settings, where they have control over personal devices. However, if you set up Windows using a personal account, the error message should ideally not appear. Although this is not always the case. Most users who encounter errors report using their personal accounts. Why does my organization ask me to change my PIN on Windows 11? It's possible that your account is associated with an organization, and your primary approach should be to verify this. Contacting your domain administrator can help! Additionally, misconfigured local policy settings or incorrect registry keys can cause errors. Right now

How to adjust window border settings on Windows 11: Change color and size How to adjust window border settings on Windows 11: Change color and size Sep 22, 2023 am 11:37 AM

Windows 11 brings fresh and elegant design to the forefront; the modern interface allows you to personalize and change the finest details, such as window borders. In this guide, we'll discuss step-by-step instructions to help you create an environment that reflects your style in the Windows operating system. How to change window border settings? Press + to open the Settings app. WindowsI go to Personalization and click Color Settings. Color Change Window Borders Settings Window 11" Width="643" Height="500" > Find the Show accent color on title bar and window borders option, and toggle the switch next to it. To display accent colors on the Start menu and taskbar To display the theme color on the Start menu and taskbar, turn on Show theme on the Start menu and taskbar

How to change title bar color on Windows 11? How to change title bar color on Windows 11? Sep 14, 2023 pm 03:33 PM

By default, the title bar color on Windows 11 depends on the dark/light theme you choose. However, you can change it to any color you want. In this guide, we'll discuss step-by-step instructions for three ways to change it and personalize your desktop experience to make it visually appealing. Is it possible to change the title bar color of active and inactive windows? Yes, you can change the title bar color of active windows using the Settings app, or you can change the title bar color of inactive windows using Registry Editor. To learn these steps, go to the next section. How to change title bar color in Windows 11? 1. Using the Settings app press + to open the settings window. WindowsI go to "Personalization" and then

OOBELANGUAGE Error Problems in Windows 11/10 Repair OOBELANGUAGE Error Problems in Windows 11/10 Repair Jul 16, 2023 pm 03:29 PM

Do you see "A problem occurred" along with the "OOBELANGUAGE" statement on the Windows Installer page? The installation of Windows sometimes stops due to such errors. OOBE means out-of-the-box experience. As the error message indicates, this is an issue related to OOBE language selection. There is nothing to worry about, you can solve this problem with nifty registry editing from the OOBE screen itself. Quick Fix – 1. Click the “Retry” button at the bottom of the OOBE app. This will continue the process without further hiccups. 2. Use the power button to force shut down the system. After the system restarts, OOBE should continue. 3. Disconnect the system from the Internet. Complete all aspects of OOBE in offline mode

How to enable or disable taskbar thumbnail previews on Windows 11 How to enable or disable taskbar thumbnail previews on Windows 11 Sep 15, 2023 pm 03:57 PM

Taskbar thumbnails can be fun, but they can also be distracting or annoying. Considering how often you hover over this area, you may have inadvertently closed important windows a few times. Another disadvantage is that it uses more system resources, so if you've been looking for a way to be more resource efficient, we'll show you how to disable it. However, if your hardware specs can handle it and you like the preview, you can enable it. How to enable taskbar thumbnail preview in Windows 11? 1. Using the Settings app tap the key and click Settings. Windows click System and select About. Click Advanced system settings. Navigate to the Advanced tab and select Settings under Performance. Select "Visual Effects"

Display scaling guide on Windows 11 Display scaling guide on Windows 11 Sep 19, 2023 pm 06:45 PM

We all have different preferences when it comes to display scaling on Windows 11. Some people like big icons, some like small icons. However, we all agree that having the right scaling is important. Poor font scaling or over-scaling of images can be a real productivity killer when working, so you need to know how to customize it to get the most out of your system's capabilities. Advantages of Custom Zoom: This is a useful feature for people who have difficulty reading text on the screen. It helps you see more on the screen at one time. You can create custom extension profiles that apply only to certain monitors and applications. Can help improve the performance of low-end hardware. It gives you more control over what's on your screen. How to use Windows 11

10 Ways to Adjust Brightness on Windows 11 10 Ways to Adjust Brightness on Windows 11 Dec 18, 2023 pm 02:21 PM

Screen brightness is an integral part of using modern computing devices, especially when you look at the screen for long periods of time. It helps you reduce eye strain, improve legibility, and view content easily and efficiently. However, depending on your settings, it can sometimes be difficult to manage brightness, especially on Windows 11 with the new UI changes. If you're having trouble adjusting brightness, here are all the ways to manage brightness on Windows 11. How to Change Brightness on Windows 11 [10 Ways Explained] Single monitor users can use the following methods to adjust brightness on Windows 11. This includes desktop systems using a single monitor as well as laptops. let's start. Method 1: Use the Action Center The Action Center is accessible

How to Fix Activation Error Code 0xc004f069 in Windows Server How to Fix Activation Error Code 0xc004f069 in Windows Server Jul 22, 2023 am 09:49 AM

The activation process on Windows sometimes takes a sudden turn to display an error message containing this error code 0xc004f069. Although the activation process is online, some older systems running Windows Server may experience this issue. Go through these initial checks, and if they don't help you activate your system, jump to the main solution to resolve the issue. Workaround – close the error message and activation window. Then restart the computer. Retry the Windows activation process from scratch again. Fix 1 – Activate from Terminal Activate Windows Server Edition system from cmd terminal. Stage – 1 Check Windows Server Version You have to check which type of W you are using

See all articles