> 백엔드 개발 > PHP 튜토리얼 > PHP 비트 연산자

PHP 비트 연산자

WBOY
풀어 주다: 2016-07-30 13:30:44
원래의
1261명이 탐색했습니다.

비트 연산자를 사용하면 정수의 지정된 비트를 평가하고 조작할 수 있습니다.

位运算符
例子 名称 结果
$a & $b</codefira></span></td> <td>And(按位与)</td> <td>将把 <var>$a</var> 和 <var>$b</var> 中都为 1 的位设为 1。</td> </tr> <tr> <td><span><codefira mono code pro word-wrap:break-word>$a | $b</codefira></span></td> <td>Or(按位或)</td> <td>将把 <var>$a</var> 和 <var>$b</var> 中任何一个为 1 的位设为 1。</td> </tr> <tr> <td><span><codefira mono code pro word-wrap:break-word>$a ^ $b</codefira></span></td> <td>Xor(按位异或)</td> <td>将把 <var>$a</var> 和 <var>$b</var> 中一个为 1 另一个为 0 的位设为 1。</td> </tr> <tr> <td><span><codefira mono code pro word-wrap:break-word>~ $a</codefira></span></td> <td>Not(按位取反)</td> <td>将 <var>$a</var> 中为 0 的位设为 1,反之亦然。</td> </tr> <tr> <td><span><codefira mono code pro word-wrap:break-word>$a << $bShift left(左移)$a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
$a >> $b</codefira></span></td> <td>Shift right(右移)</td> <td>将 <var>$a</var> 中的位向右移动 <var>$b</var> 次(每一次移动都表示“除以 2”)。</td> </tr> </tbody> </table> <p>변위는 PHP의 수학 연산입니다. 어떤 방향으로든 밖으로 이동한 비트는 폐기됩니다. 왼쪽으로 이동하면 오른쪽이 0으로 채워지고 부호 비트가 멀리 이동합니다. 즉, 부호가 유지되지 않습니다. 오른쪽으로 이동하면 왼쪽이 부호 비트로 채워지므로 부호가 유지됩니다. </p> <p>원하는 우선순위를 보장하려면 괄호를 사용하세요. 예를 들어 <span>$a & $b == true</span>는 먼저 비교를 수행한 다음 비트 AND를 수행하고 <span>($a & $b) == true</span>는 비트 AND를 먼저 수행한 다음 비교를 수행합니다. </p> <p>데이터 유형 변환에 주의하세요. 왼쪽 인수와 오른쪽 인수가 모두 문자열인 경우 비트 연산자는 문자의 ASCII 값에 대해 작동합니다. </p> <p></p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">PHP 的 ini 设定 error_reporting 使用了按位的值, 提供了关闭某个位的真实例子。要显示除了提示级别 之外的所有错误,php.ini 中是这样用的: &lt;span&gt;&lt;codefira mono code pro word-wrap:break-word&gt;E_ALL &amp; ~E_NOTICE&lt;/codefira&gt;&lt;/span&gt;</pre><div class="contentsignin">로그인 후 복사</div></div> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">具体运作方式是先取得 E_ALL 的值: &lt;span&gt;00000000000000000111011111111111&lt;/span&gt; 再取得 E_NOTICE 的值: &lt;span&gt;00000000000000000000000000001000&lt;/span&gt; 然后通过 &lt;span&gt;~&lt;/span&gt; 将其取反: &lt;span&gt;11111111111111111111111111110111&lt;/span&gt; 最后再用按位与 AND(&amp;)得到两个值中都设定了(为 1)的位: &lt;span&gt;00000000000000000111011111110111&lt;/span&gt;</pre><div class="contentsignin">로그인 후 복사</div></div> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">另外一个方法是用按位异或 XOR(&lt;span&gt;^&lt;/span&gt;)来取得只在 其中一个值中设定了的位: &lt;span&gt;&lt;codefira mono code pro word-wrap:break-word&gt;E_ALL ^ E_NOTICE&lt;/codefira&gt;&lt;/span&gt;</pre><div class="contentsignin">로그인 후 복사</div></div> <p></p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">error_reporting 也可用来演示怎样置位。只显示错误和可恢复 错误的方法是: &lt;span&gt;&lt;codefira mono code pro word-wrap:break-word&gt;E_ERROR | E_RECOVERABLE_ERROR&lt;/codefira&gt;&lt;/span&gt;</pre><div class="contentsignin">로그인 후 복사</div></div> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">也就是将 E_ERROR &lt;span&gt;00000000000000000000000000000001&lt;/span&gt; 和 E_RECOVERABLE_ERROR &lt;span&gt;00000000000000000001000000000000&lt;/span&gt; 用按位或 OR(&lt;span&gt;|&lt;/span&gt;)运算符来取得在任何一个值中被置位的结果: &lt;span&gt;00000000000000000001000000000001&lt;/span&gt;</pre><div class="contentsignin">로그인 후 복사</div></div> <p></p> <p><span>예제 1 정수의 AND, OR 및 XOR 비트 연산자</span></p> <p></p> <p><codefira mono code pro word-wrap:break-word display:block><codefira mono code pro word-wrap:break-word display:block><span><span><?php<br></span><span>/*<br> * Ignore the top section,<br> * it is just formatting to make output clearer.<br> */<br></span><span>$format </span><span>= </span><span>'(%1d = %1b) = (%2d = %2b)'<br> </span><span>. </span><span>' %3$s (%4d = %4b)' </span><span>. </span><span>"n"</span><span>;<br>echo <<<EOH<br></span><span> --------- --------- -- ---------<br> result value op test<br> --------- --------- -- ---------<br></span><span>EOH;<br></span><span>/*<br> * Here are the examples.<br> */<br></span><span>$values </span><span>= array(</span><span>0</span><span>, </span><span>1</span><span>, </span><span>2</span><span>, </span><span>4</span><span>, </span><span>8</span><span>);<br></span><span>$test </span><span>= </span><span>1 </span><span>&#43; </span><span>4</span><span>;<br>echo </span><span>"n Bitwise AND n"</span><span>;<br>foreach (</span><span>$values </span><span>as </span><span>$value</span><span>) {<br> </span><span>$result </span><span>= </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>, </span><span>$value</span><span>, </span><span>'&'</span><span>, </span><span>$test</span><span>);<br>}<br>echo </span><span>"n Bitwise Inclusive OR n"</span><span>;<br>foreach (</span><span>$values </span><span>as </span><span>$value</span><span>) {<br> </span><span>$result </span><span>= </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>, </span><span>$value</span><span>, </span><span>'|'</span><span>, </span><span>$test</span><span>);<br>}<br>echo </span><span>"n Bitwise Exclusive OR (XOR) n"</span><span>;<br>foreach (</span><span>$values </span><span>as </span><span>$value</span><span>) {<br> </span><span>$result </span><span>= </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>, </span><span>$value</span><span>, </span><span>'^'</span><span>, </span><span>$test</span><span>);<br>}<br></span><span>?></span></span></codefira></codefira></p><?php < br></p><p>/*<br> * 상단 섹션을 무시하세요.<br> * 출력을 더 명확하게 하기 위한 형식일 뿐입니다.<br> */<br><p></p>$format </p><p>= <p><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">로그인 후 복사</div></div>'(%1$2d = %1$04b) = (%2$2d = %2$04b)'<br> </p></p> </p> <p>' %3$s (%4$2d = %4$04b)' <p><span>. </span></p>"n"<🎜><🎜>;<br>에코 <&lt ; <EOH<br><🎜><🎜> --------- --------- -- ---------<br> 결과값 연산 테스트< br > --------- --------- -- ---------<br><🎜><🎜>EOH;<br><🎜><🎜 > /*<br> * 예시는 다음과 같습니다.<br> */<br><🎜><🎜>$values ​​​​<🎜><🎜>= array(<🎜><🎜>0<🎜><🎜 > , <🎜><🎜>1<🎜><🎜>, <🎜><🎜>2<🎜><🎜>, <🎜><🎜>4<🎜><🎜>, <🎜><🎜> 8 <🎜><🎜>);<br><🎜><🎜>$test <🎜><🎜>= <🎜><🎜>1 <🎜><🎜>+ <🎜><🎜>4<🎜 > <🎜>;<br>echo <🎜><🎜>"n Bitwise AND n"<🎜><🎜>;<br>foreach (<🎜><🎜>$values ​​​​<🎜><🎜>as <🎜> <🎜>$value<🎜><🎜>) {<br> <🎜><🎜>$result <🎜><🎜>= <🎜><🎜>$value <🎜><🎜>& < 🎜>< 🎜>$test<🎜><🎜>;<br> <🎜><🎜>printf<🎜><🎜>(<🎜><🎜>$format<🎜><🎜>, <🎜>< 🎜>$ 결과<🎜><🎜>, <🎜><🎜>$value<🎜><🎜>, <🎜><🎜>'&'<🎜><🎜>, <🎜><🎜>$test <🎜> <🎜>);<br>}<br>echo <🎜><🎜>"n 비트 포함 OR n"<🎜><🎜>;<br>foreach (<🎜><🎜>$values ​​​​<🎜>< 🎜><🎜><🎜>$value<🎜><🎜>) {<br> <🎜><🎜>$result <🎜><🎜>= <🎜><🎜>$value <🎜><🎜 >| 🎜><🎜>$result<🎜><🎜>, <🎜><🎜>$value<🎜><🎜>, <🎜><🎜>'|'<🎜><🎜 >, <🎜><🎜 >$test<🎜><🎜>);<br>}<br>echo <🎜><🎜>"n 비트 배타적 OR(XOR) n"<🎜><🎜>;< br>foreach (<🎜> <🎜>$values ​​​​<🎜><🎜>as <🎜><🎜>$value<🎜><🎜>) {<br> <🎜><🎜>$result <🎜 ><🎜>= <🎜>< 🎜>$값 <🎜><🎜>^ <🎜><🎜>$test<🎜><🎜>;<br> 형식<🎜><🎜>, <🎜>< 🎜>$결과<🎜><🎜>, <🎜><🎜>$값<🎜><🎜>, <🎜><🎜>'^'<🎜> <🎜>, <🎜><🎜>$test <🎜><🎜>);<br>}<br><🎜><🎜>?>위 루틴은 출력: 예제 #2 문자열 XOR 연산자<p></p> <p><codefira mono code pro word-wrap:break-word display:block><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>?></span></span></codefira></p> <p></p> <p><span>예제 #3 정수의 치환 </span></p> <p></p> <p><codefira mono code pro word-wrap:break-word display:block><span><span><?php<br></span><span>/*<br> * 다음은 예시입니다.<br> */<br></span> <span>에코 </span><span>"n--- 양수 정수에서 오른쪽으로 비트 이동 ---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>'왼쪽으로 이동된 기호 비트의 사본'</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>'비트가 오른쪽으로 이동'</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>'위와 동일한 결과; 0 이상으로 이동할 수 없음'</span><span>);<br>에코 </span><span>"n--- 음수 정수에 대해 오른쪽으로 비트 이동 ---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>'왼쪽으로 이동된 기호 비트의 복사본'</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>'비트가 오른쪽으로 이동'</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>'위와 동일한 결과; -1 이상으로 이동할 수 없음'</span><span>);<br>에코</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>'오른쪽에 0 채우기'</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>'부호 비트가 밖으로 이동'</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>'비트 시프트 아웃 왼쪽'</span><span>);<br>에코 </span><span>"n--- 비트 시프트 왼쪽 ON 음수 정수 ---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><&lt ; </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>'오른쪽 채우기'</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>'부호 비트를 포함하여 왼쪽으로 비트 이동'</span><span>);<br></span><span>/*<br> * 이 하단 섹션을 무시하세요.<br> * 그냥 형식을 지정하는 것뿐입니다. 출력을 더 명확하게 만듭니다.<br> */<br></span><span>기능 </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>$ 참고 </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">로그인 후 복사</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">로그인 후 복사</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="http://image.codes51.com/Article/image/20150824/20150824204951_7209.png" 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>맞춤형 비트와이즈 플래그 PHP 객체<br>가끔 여러 부울 TRUE 또는 FALSE 값을 보유하는 사용자 정의 PHP 객체가 필요할 때가 있습니다. 각각에 대한 변수를 쉽게 포함할 수 있지만 항상 그렇듯이 코드에는 매우 빠르게 불안정해지는 방법이 있습니다. 보다 지능적인 접근 방식이 항상 답인 것 같습니다. 처음에는 너무 과도해 보인다면.<br>$flags라는 단일 정수 변수를 보유하는 추상 기본 클래스로 시작합니다. 이 간단한 정수는 32개의 TRUE 또는 FALSE 부울 값을 보유할 수 있습니다. 고려해야 할 또 다른 사항은 다른 BITS를 방해하지 않고 특정 BIT 값을 설정하는 것입니다. 따라서 클래스 정의에는 선택한 비트만 설정하는 setFlag($flag, $value) 함수가 포함되어 있습니다. 추상 기본 클래스 정의는 다음과 같습니다. <br><span><?php<br></span><span># BitwiseFlag.php<br></span><span>추상 클래스 </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>$flag</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>플래그 </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><span><br># User.php</span><span><br>require(</span><span>'BitwiseFlag.php'</span><span>);</span>클래스 <span><br>사용자 </span><span>확장 </span><span>BitwiseFlag</span><span><br>{ </span>  const <span><br>FLAG_REGISTERED </span><span>= </span><span>1</span><span>; </span><span>// $flags의 BIT #1에는 값이 1</span>  <span><br>const </span><span>FLAG_ACTIVE </span><span>= </span><span>2</span><span>입니다.     </span><span>// $flags의 BIT #2에는 값이 2입니다</span>  <span><br>const </span><span>FLAG_MEMBER </span><span>= </span><span>4</span><span>;     </span><span>// $flags의 BIT #3에는 값이 4입니다</span>  <span><br>const </span><span>FLAG_ADMIN </span><span>= </span><span>8</span><span>;      </span><span>// $flags의 BIT #4 값은 8입니다</span>  <span><br>공개 함수 </span><span>isRegistered</span><span>(){</span>    return <span><br>$this</span><span>-></span><span>isFlagSet</span><span>(</span><span>self</span><span>::</span><span>FLAG_REGISTERED</span><span>);</span>  }<span>  공개 함수 <br><br>isActive</span><span>(){</span>    return <span><br>$this</span> <span>-></span><span>isFlagSet</span><span>(</span><span>self</span><span>::</span><span>FLAG_ACTIVE</span><span>); </span>  }<span>  공개 함수 <br><br>isMember</span><span>(){</span>    return <span><br>$this</span><span>-></span><span>isFlagSet</span><span>(</span><span>self</span><span>::</span><span>FLAG_MEMBER</span><span>);</span>  }<span>  공개 함수 <br><br>isAdmin</span><span>(){</span>    return <span><br>$this</span><span>-></span><span>isFlagSet</span><span>( </span><span>self</span><span>::</span><span>FLAG_ADMIN</span><span>);</span>  }<span>  공개 기능 <br><br>setRegistered</span><span>(</span><span>$value</span><span>){</span>    <span><br>$this</span><span>-></span><span>setFlag</span><span>(</span><span>자신</span><span>::</span><span>FLAG_REGISTERED</span><span>, </span><span>$value</span><span>);</span>  }<br>  공개 함수 <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>  공개 함수 </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>  공개 함수 </span><span>setAdmin</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_ADMIN</span><span>, </span><span>$value</span><span>); <br>  }<br>  공개 함수 </span><span>__toString</span><span>(){<br>    return </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>isMember</span><span>() ? </span><span>' 회원' </span><span>: </span><span>''</span><span>) .<br>      (</span><span>$this</span><span>-></span><span>isAdmin</span><span>() ? </span><span>' 관리자' </span><span>: </span><span>''</span><span>) .<br>    </span><span>']'</span><span>;<br>  }<br>}<br></span><span>?><br></span><br>이것은 많은 작업처럼 보이지만 우리는 많은 문제를 해결했습니다. 예를 들어 코드 사용 및 유지 관리가 쉽고 플래그 값을 가져오고 설정하는 것이 합리적입니다. User 클래스를 사용하면 이제 비트별 플래그 작업이 얼마나 쉽고 직관적인지 확인할 수 있습니다. 됩니다.<br><span><?php<br></span><span>require(</span><span>'User.php'</span><span>)<br></span><span> $user</span><span>= 신규</span><span>사용자</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>참</span><span>);<br>에코</span><span>$user</span><span>;  </span><span>// 출력: 사용자 [REGISTERED ACTIVE MEMBER ADMIN]<br></span><span>?></span><p></p><p></p><p>up</p><p>아래</p><div title="100% like this...">6<span><span>zlel hotmail dot com~=s/x/ee/g</span></span>의 grxnslxves13 ? <div title="2005-10-26 07:30"> <span>9년 전</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>)) &#43; </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>위</p> <p>아래</p> <div title="100% like this...">3<span><span>처짐 ich dot net</span></span>에서 ? <div title="2013-07-14 06:52"> <span>2년 전</span><p></p> <p><codefira mono code pro display:block><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&#43;&#43;) {<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>비트 단위로 다시 구현 NOT (~)
    보호된 함수 FlipBin($number) {
        $bin = str_pad(base_convert($number, 10, 2), 32, 0, STR_PAD_LEFT);
        for ($i = 0; $i < 32; $i++) {
            스위치($bin{$i}) {
                케이스 '0' :
                  $bin{$i} = '1';
                    break;
                사례 '1' :
                  $bin{$i} = '0';
                    break;
            }
        }
        return binec($ bin);
    }< br>이점은 더 큰 숫자 MAX_INT

위로

아래로<🎜>에서 작동한다는 것입니다.
3

비베카난드 gmail dot com의 dot pathak25 ?
2년 전

<codeFira Mono','Source Code Pro',monospace; 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&#43;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&#43;2&#43;1 = 11<br>3 bits set, in the 8, 2, and 1 column.add those up 8&#43;2&#43;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&#43;1 = 3<br>the 2 bit and the 1 bit that they each have set but don't share. Soooo 2&#43;1 = 3</span>$a =     9;
$b =     10;
echo $a & $b;
자리 값   128  64  32  16   8  4   2   1
$a                     0 0    0     0    1  0   0   1   =9
$b                     0      0    0     0    1   0  1   0   =10
결과   8  
함께 공유하는 유일한 비트는 8비트입니다. . 따라서 8이 반환됩니다.
$a =     36;
$b =     103;
echo $a & $b;
자리값   128  64  32  16   8    4   2   1
$a                     0      0    1     0   0    1   0   0   = 36
$b                     0      1    1     0    0    1   1   1   =103
결과  32+4 = 36
이 둘이 함께 공유하는 유일한 비트는 비트 32와 4이며 함께 더하면 36을 반환합니다.
$a =     9;
$b =     10;
echo $a | $b;
자리값   128  64  32  16   8  4   2   1
$a                     0      0    0     0   1  0   0   1 =9
$b                     0      0    0     0    1   0  1   0   =10
결과 8+2+1 = 11
8, 2, 1 열에 3비트 세트, 8+ 2+1이면 11
$a =     9;
$b =     10;
echo $a ^ $b;
자리 값   128  64  32  16   8  4   2   1
$ a                   0      0    0     0    1  0   0   1   =9
$b                     0      0    0     0    1   0  1   0   =10
결과  2+1 = 3
각각 설정한 2비트와 1비트 하지만 공유하지는 마세요. ㅋㅋㅋ 2+1 = 3

아래

3

에리치 seachawaii 닷컴
에서 ? 2년 전

<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></p>부정적인 사항에 관해 참고사항 문서에 명시된 바와 같이 시프트 값은 각 시프트가 정수 곱하기 또는 나누기(각각 왼쪽 또는 오른쪽)에 2입니다. 즉, 음수 시프트 값(오른쪽 피연산자)은 시프트 방향이 아니라 시프트 부호에 영향을 미칩니다. 나는 예상했습니다.  <br>FE. 0xff>> -2는 0x0 <br>및 0xff << -2 결과는 0xFFFFFFFFC0000000(PHP_INT_MAX에 따라 다름)</p>

아래

4 cw3theophilus Gmail 닷컴에서
 ?

6년 전<🎜><🎜>

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:
(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.)
function circular_shift($num,$offset) { //Do a nondestructive circular bitwise shift, if offset positive shift left, if negative shift right
$num=(int)$num;
$mask=0x7fffffff; //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
if ($offset>0) {
        
$num=($num<<$offset%32) | (($num>>(32-$offset%32)) & ($mask>>(31-$offset%32)));
    }
    elseif (
$offset<0){
$offset=abs($offset);
$num=(($num>>$offset%32) & ($mask>>(-1+$offset%32))) | ($num<<(32-$offset%32));
}
return
$num;
}
?>

아래

3m0sh 핫메일 닷컴 ?
7년 전

@greenone - nice function, thanks. I've adapted it for key usage:
function bitxor($str, $key) {
$xorWidth = PHP_INT_SIZE*8;
// split
$o1 = str_split($str, $xorWidth);
$o2 = str_split(str_pad('', strlen($str), $key), $xorWidth);
$res = '';
$runs = count($o1);
for(
$i=0;$i<$runs;$i++)
$res .= decbin(bindec($o1[$i]) ^ bindec($o2[$i]));
return
$res;
}
?>

아래

3에릭 스완슨 ?
9년 전

Perl vs. PHP implementation of the ^ operator:
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.
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.
/*
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.
*/
function binxor($a, $b) {
    return bindec(decbin((float)$a ^ (float)$b));
}
//normal PHP code will not yeild the same result as Perl
$result = 3851235679 ^ 43814; //= -443704711
//to get the same result as Perl
$result = binxor(3851235679, 43814); //= 3851262585
//YIPPEE!!!
//to see the differences, try the following
$a = 3851235679 XOR 43814;
$b = 3851235679 ^ 43814; //integer result
$c = (float)3851235679 ^ (float)43814; //same as $b
$d = binxor(3851235679, 43814); //same as Perl!!
echo("A: $a
");
echo("B: $b
");
echo("C: $c
");
echo("D: $d
");
Perl과 PHP 구현 비교 ^ 연산자:
Perl 모듈을 PHP로 변환하려고 시도한 후 Perl의 ^ 연산자 구현이 PHP 구현과 다르다는 것을 깨달았습니다.  기본적으로 Perl은 변수를 부동 소수점으로 처리하고 PHP를 정수로 처리합니다.  PHP 사용을 확인할 수있었습니다 연산자는 "정수 사용"이라고 말합니다. Perl 모듈 내에서 PHP가 사용한 것과 똑같은 결과를 출력합니다.
PHP에서 ^ 연산자를 사용할 때 모든 변수를 (float)로 변환하는 것이 논리적인 결정입니다.  그러나 이렇게 해도 동일한 결과가 나오지는 않습니다.  약 30분 동안 벽에 머리를 부딪힌 후 보석을 발견하고 다음을 사용하여 함수를 작성했습니다. PHP의 이진-십진수 변환.
/*
비트 단위 연산에 대한 경험이 많지 않아 이것이 최선의 솔루션이라고 말할 수는 없지만 최종적으로 작동하고 항상 정확히 동일한 결과를 반환하는 솔루션인 것은 확실합니다. Perl이 제공합니다.
*/
function binxor($a, $b) {
    return bindec(decbin((float)$a ^ (float)$b));
}
//일반 PHP 코드는 Perl과 동일한 결과를 산출하지 않습니다.
$result = 3851235679 ^ 43814; //= -443704711
//Perl과 동일한 결과를 얻으려면
$result = binxor(3851235679, 43814); //= 3851262585
//YIPPEE!!!
//차이점을 보려면 다음을 시도해 보세요.
$a = 3851235679 XOR 43814;
$b = 3851235679 ^ 43814; //정수 결과
$c = (float)3851235679 ^ (float)43814; //$b와 동일
$d = binxor(3851235679, 43814); //Perl과 동일!!
echo("A: $a
");
echo("B: $b
");
echo("C : $c
");
echo("D: $d
");

아래
10그레이다 DONTSPAM dot solidinc dot org
의 dot NOSPAM ? 6년 전

처음에는 비트마스킹을 알게 되었어요 혼란스러운 개념이고 아무 소용이 없습니다. 그래서 다른 사람이 혼란스러워할 경우를 대비해 이 코드 조각을 준비했습니다.
    // 차량이 가질 수 있는 다양한 세부 정보
    
$hasFourWheels 1;
    
$hasTwoWheels   2;
    
$hasDoors      4;
    
$ hasRedColour  8;
    
$bike          $hasTwoWheels ;
$ GolfBuggy <🎜 🎜> = $ hasfourwheels ;
$ ford $hasFourWheels$hasDoors;    
$ferrari       $hasFourWheels$hasDoors $hasRedColour;    
$isBike        $hasFourWheels $자전거# 거짓입니다. $bike에는 바퀴가 4개 없습니다    
$isGolfBuggy   $hasFourWheels  $golfBuggy# 사실입니다. $golfBuggy에는 바퀴가 4개 있기 때문입니다    
$isFord        $hasFourWheels $ford# 사실입니다. 왜냐하면 $ford $hasFourWheels
?>
이를 보안과 같은 많은 항목에 적용할 수 있기 때문입니다.

    
// 보안 권한:    
$writePost 1;     
$readPost 2;    
$deletePost = 4;    
$addUser 8;    
$deleteUser 16;    
    
// 사용자 그룹:    
$administrator $writePost $readPosts $deletePosts $addUser $deleteUser;    
$moderator $readPost $deletePost $deleteUser;    
$writer $writePost $readPost;    
$guest $readPost;    
// 권한 확인 기능    
기능 checkPermission($user$권한) {        if(
$user $permission) {            return 
true;        } else {
            return 
false;       }
}
    
// 이제 모두 적용합니다!    
if(checkPermission( $administrator$deleteUser)) {        
사용자 삭제("일부 User"); # $administrator가 $deleteUser    
}할 수 있기 때문에 실행됩니다.
?>

한번 생각해 보면 매우 유용합니다! 문제를 방지하려면 각 값을 2의 거듭제곱으로 높여야 한다는 점을 기억하세요.

위로

아래로

6ivoras Gmail 닷컴에서 ?
4년 전

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 :)추가로 궁금하신 점은, 어떤 이유로 연산("18" & "32")의 결과는 "10"입니다. 즉, 문자열에 이진 연산자를 사용하지 마세요. :)

up

down10
? 10년 전

A bitwise operators practical case :
// We want to know the red, green and blue values of this color :
$color = 0xFEA946 ;
$red = $color >> 16 ;
    
$green = ($color 0x00FF00) >> ;
    
$blue $color 0x0000FF ;
    
printf('Red : %X (%d), Green : %X (%d), Blue : %X (%d)',
        
$red$red$green$green$blue$blue) ;
    
// Will display...
    // Red : FE (254), Green : A9 (169), Blue : 46 (70)
?>

실용적인 비트 연산자 case :

    

// 이 색상의 빨간색, 녹색, 파란색 값을 알고 싶습니다.

    

$color 

0xFEA946 ;
    $red 

Here is an example for bitwise leftrotate and rightrotate.
Note that this function works only with decimal numbers - other types can be converted with pack().
function rotate ( $decimal, $bits) {
$binary = decbin($decimal);
return (
bindec(substr($binary, $bits).substr($binary, 0, $bits))
);
}
// Rotate 124 (1111100) to the left with 1 bits
echo rotate(124, 1);
// = 121 (1111001)
// Rotate 124 (1111100) to the right with 3 bits
echo rotate(124, -3);
// = 79 (1001111)
?>$color 

>> 

16 

;

    

$green 
= ($color 
0x00FF00) >> 8 ;    $blue = $color &  0x0000FF ;    printf('빨간색 : %X(%d), 녹색 : %X(%d), 파란색 : %X(%d)',        $red , $red, $green, $green, $블루, $블루) ;    // 표시됩니다...    // 빨간색: FE(254), 녹색: A9(169), 파란색: 46(70)?>위아래4주리 글로미닷컴 ? 5년 전다음은 비트 단위의 예입니다. leftrotate 및 rightrotate.이 함수는 십진수에만 작동합니다. 다른 유형은 pack()으로 변환할 수 있습니다.<🎜><🎜>함수 <🎜> <🎜>회전 <🎜><🎜>( <🎜><🎜>$decimal<🎜><🎜>, <🎜><🎜>$bits<🎜><🎜>) {<🎜>  <🎜><🎜>$binary <🎜><🎜>= <🎜><🎜>decbin<🎜><🎜>(<🎜><🎜>$decimal<🎜><🎜>);< 🎜>  return (<🎜>    <🎜><🎜>bindec<🎜><🎜>(<🎜><🎜>substr<🎜><🎜>(<🎜><🎜>$binary<🎜><🎜>, <🎜><🎜>$bits<🎜><🎜>).<🎜><🎜>substr<🎜><🎜>(<🎜><🎜>$binary<🎜><🎜>, <🎜><🎜 >0<🎜><🎜>, <🎜><🎜>$bits<🎜><🎜>))<🎜>  );<🎜>}<🎜><🎜><🎜>// 124 회전(1111100) 왼쪽으로 1비트<🎜><🎜><🎜>에코 <🎜><🎜>회전<🎜><🎜>(<🎜><🎜>124<🎜><🎜>, <🎜><🎜> 1<🎜><🎜>);<🎜><🎜><🎜>// = 121(1111001)<🎜>// 124(1111100)을 3비트 오른쪽으로 회전<🎜><🎜><🎜> 에코 <🎜><🎜>회전<🎜><🎜>(<🎜><🎜>124<🎜><🎜>, -<🎜><🎜>3<🎜><🎜>);<🎜><🎜><🎜>// = 79(1001111)<🎜><🎜><🎜>?> 위아래3josh joshstrike dot com에서 ? 4년 전

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: 
echo masksOf(3,10);
function
masksOf($n,$bits) {
$u = pow(2,$bits)-1; //start value, full flags on.
$masks = array();
while (
$u>0) { 
        
$z numflags($u); 
        if (
$z==$narray_push($masks,$u); 
        
$u--; 
    } 
    return (
$masks);    

function 
numflags($n) { 
    
$k 0
    while (
$n) { 
        
$k += $n 1
        
$n $n >> 1
    } 
    return (
$k); 
//    alternately: 
//    $u = 0; 
//    for ($k=1;$k<=$n;$k*=2) {
// $u+=($n&$k?1:0);
// }
// return ($u);
}
?>

아래

4스펜서 피모이 예를 들어 닷컴 ?
3년 전

The NOT or complement operator ( ~ ) and negative binary numbers can be confusing.
~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.
NOTE: just using 4 bits here for the examples below but in reality PHP uses 32 bits.
Converting a negative decimal number (ie: -3) into binary takes 3 steps:
1) convert the positive version of the decimal number into binary (ie: 3 = 0011)
2) flips the bits (ie: 0011 becomes 1100)
3) add 1 (ie: 1100  + 0001 = 1101)
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.
NOT 또는 보수 연산자 ( ~ ) 및 음의 이진수는 혼동될 수 있습니다.
~2 = -3  수식을 사용하기 때문입니다  ~x = -x - 1  십진수의 비트 보수는 숫자 빼기 1의 부정입니다.
참고: 아래 예에서는 여기서는 4비트만 사용하지만 실제로는 PHP는 32비트를 사용합니다.
음수 십진수(예: -3)를 이진수로 변환하려면 3단계가 필요합니다.
1) 양수 버전을 변환합니다. 10진수를 2진수로(예: 3 = 0011)
2) 비트를 뒤집습니다(예: 0011이 1100이 됨)
3) 1을 더합니다(예: 1100  + 0001 = 1101)
어떻게 될지 궁금할 것입니다. 1101 = -3입니다. PHP는 음의 이진수를 렌더링하기 위해 "2의 보수" 방법을 사용합니다. 가장 왼쪽 비트가 1이면 이진수는 음수이므로 비트를 뒤집어 1을 더합니다. 0이면 양수이므로 더 이상 계산하지 않습니다. 무엇이든 해야 합니다. 따라서 0010은 양수 2가 됩니다. 1101이면 음수이므로 비트를 뒤집어 0010을 얻습니다. 1을 더하면 -3과 같은 0011을 얻습니다.

아래
4실버
 ? 6예
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿