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

PHP 비트 연산자

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

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

位运算符
例子 名称 结果
$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="/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>맞춤형 비트와이즈 플래그 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예
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

해결 방법: 조직에서 PIN 변경을 요구합니다. 해결 방법: 조직에서 PIN 변경을 요구합니다. Oct 04, 2023 pm 05:45 PM

로그인 화면에 "귀하의 조직에서 PIN 변경을 요구합니다"라는 메시지가 나타납니다. 이는 개인 장치를 제어할 수 있는 조직 기반 계정 설정을 사용하는 컴퓨터에서 PIN 만료 제한에 도달한 경우 발생합니다. 그러나 개인 계정을 사용하여 Windows를 설정하는 경우 이상적으로는 오류 메시지가 나타나지 않습니다. 항상 그런 것은 아니지만. 오류가 발생한 대부분의 사용자는 개인 계정을 사용하여 신고합니다. 조직에서 Windows 11에서 PIN을 변경하도록 요청하는 이유는 무엇입니까? 귀하의 계정이 조직과 연결되어 있을 수 있으므로 이를 확인하는 것이 기본 접근 방식입니다. 도메인 관리자에게 문의하면 도움이 될 수 있습니다! 또한 잘못 구성된 로컬 정책 설정이나 잘못된 레지스트리 키로 인해 오류가 발생할 수 있습니다. 지금 바로

Windows 11에서 창 테두리 설정을 조정하는 방법: 색상 및 크기 변경 Windows 11에서 창 테두리 설정을 조정하는 방법: 색상 및 크기 변경 Sep 22, 2023 am 11:37 AM

Windows 11은 신선하고 우아한 디자인을 전면에 내세웠습니다. 현대적인 인터페이스를 통해 창 테두리와 같은 미세한 세부 사항을 개인화하고 변경할 수 있습니다. 이 가이드에서는 Windows 운영 체제에서 자신의 스타일을 반영하는 환경을 만드는 데 도움이 되는 단계별 지침을 설명합니다. 창 테두리 설정을 변경하는 방법은 무엇입니까? +를 눌러 설정 앱을 엽니다. Windows개인 설정으로 이동하여 색상 설정을 클릭합니다. 색상 변경 창 테두리 설정 창 11" Width="643" Height="500" > 제목 표시줄 및 창 테두리에 강조 색상 표시 옵션을 찾아 옆에 있는 스위치를 토글합니다. 시작 메뉴 및 작업 표시줄에 강조 색상을 표시하려면 시작 메뉴와 작업 표시줄에 테마 색상을 표시하려면 시작 메뉴와 작업 표시줄에 테마 표시를 켭니다.

Windows 11에서 제목 표시줄 색상을 변경하는 방법은 무엇입니까? Windows 11에서 제목 표시줄 색상을 변경하는 방법은 무엇입니까? Sep 14, 2023 pm 03:33 PM

기본적으로 Windows 11의 제목 표시줄 색상은 선택한 어두운/밝은 테마에 따라 다릅니다. 그러나 원하는 색상으로 변경할 수 있습니다. 이 가이드에서는 이를 변경하고 데스크톱 환경을 개인화하여 시각적으로 매력적으로 만드는 세 가지 방법에 대한 단계별 지침을 논의합니다. 활성 창과 비활성 창의 제목 표시줄 색상을 변경할 수 있습니까? 예, 설정 앱을 사용하여 활성 창의 제목 표시줄 색상을 변경하거나 레지스트리 편집기를 사용하여 비활성 창의 제목 표시줄 색상을 변경할 수 있습니다. 이러한 단계를 알아보려면 다음 섹션으로 이동하세요. Windows 11에서 제목 표시줄 색상을 변경하는 방법은 무엇입니까? 1. 설정 앱을 사용하여 +를 눌러 설정 창을 엽니다. Windows"개인 설정"으로 이동한 다음

Windows 11/10 복구의 OOBELANGUAGE 오류 문제 Windows 11/10 복구의 OOBELANGUAGE 오류 문제 Jul 16, 2023 pm 03:29 PM

Windows Installer 페이지에 "OOBELANGUAGE" 문과 함께 "문제가 발생했습니다."가 표시됩니까? 이러한 오류로 인해 Windows 설치가 중단되는 경우가 있습니다. OOBE는 즉시 사용 가능한 경험을 의미합니다. 오류 메시지에서 알 수 있듯이 이는 OOBE 언어 선택과 관련된 문제입니다. 걱정할 필요가 없습니다. OOBE 화면 자체에서 레지스트리를 편집하면 이 문제를 해결할 수 있습니다. 빠른 수정 – 1. OOBE 앱 하단에 있는 “다시 시도” 버튼을 클릭하세요. 그러면 더 이상의 문제 없이 프로세스가 계속됩니다. 2. 전원 버튼을 사용하여 시스템을 강제 종료합니다. 시스템이 다시 시작된 후 OOBE가 계속되어야 합니다. 3. 인터넷에서 시스템 연결을 끊습니다. 오프라인 모드에서 OOBE의 모든 측면을 완료하세요.

Windows 11에서 작업 표시줄 축소판 미리 보기를 활성화 또는 비활성화하는 방법 Windows 11에서 작업 표시줄 축소판 미리 보기를 활성화 또는 비활성화하는 방법 Sep 15, 2023 pm 03:57 PM

작업 표시줄 축소판은 재미있을 수도 있지만 주의를 산만하게 하거나 짜증나게 할 수도 있습니다. 이 영역 위로 얼마나 자주 마우스를 가져가는지 고려하면 실수로 중요한 창을 몇 번 닫았을 수도 있습니다. 또 다른 단점은 더 많은 시스템 리소스를 사용한다는 것입니다. 따라서 리소스 효율성을 높일 수 있는 방법을 찾고 있다면 비활성화하는 방법을 알려드리겠습니다. 그러나 하드웨어 사양이 이를 처리할 수 있고 미리 보기가 마음에 들면 활성화할 수 있습니다. Windows 11에서 작업 표시줄 축소판 미리 보기를 활성화하는 방법은 무엇입니까? 1. 설정 앱을 사용하여 키를 탭하고 설정을 클릭합니다. Windows에서는 시스템을 클릭하고 정보를 선택합니다. 고급 시스템 설정을 클릭합니다. 고급 탭으로 이동하여 성능 아래에서 설정을 선택합니다. "시각 효과"를 선택하세요.

Windows 11의 디스플레이 크기 조정 가이드 Windows 11의 디스플레이 크기 조정 가이드 Sep 19, 2023 pm 06:45 PM

Windows 11의 디스플레이 크기 조정과 관련하여 우리 모두는 서로 다른 선호도를 가지고 있습니다. 큰 아이콘을 좋아하는 사람도 있고, 작은 아이콘을 좋아하는 사람도 있습니다. 그러나 올바른 크기 조정이 중요하다는 점에는 모두가 동의합니다. 잘못된 글꼴 크기 조정이나 이미지의 과도한 크기 조정은 작업 시 생산성을 저하시킬 수 있으므로 시스템 기능을 최대한 활용하려면 이를 사용자 정의하는 방법을 알아야 합니다. Custom Zoom의 장점: 화면의 텍스트를 읽기 어려운 사람들에게 유용한 기능입니다. 한 번에 화면에서 더 많은 것을 볼 수 있도록 도와줍니다. 특정 모니터 및 응용 프로그램에만 적용되는 사용자 정의 확장 프로필을 생성할 수 있습니다. 저사양 하드웨어의 성능을 향상시키는 데 도움이 될 수 있습니다. 이를 통해 화면의 내용을 더 효과적으로 제어할 수 있습니다. 윈도우 11을 사용하는 방법

Windows 11에서 밝기를 조정하는 10가지 방법 Windows 11에서 밝기를 조정하는 10가지 방법 Dec 18, 2023 pm 02:21 PM

화면 밝기는 최신 컴퓨팅 장치를 사용할 때 필수적인 부분이며, 특히 화면을 장시간 볼 때 더욱 그렇습니다. 눈의 피로를 줄이고, 가독성을 높이며, 콘텐츠를 쉽고 효율적으로 보는 데 도움이 됩니다. 그러나 설정에 따라 밝기 관리가 어려울 수 있으며, 특히 새로운 UI 변경이 적용된 Windows 11에서는 더욱 그렇습니다. 밝기를 조정하는 데 문제가 있는 경우 Windows 11에서 밝기를 관리하는 모든 방법은 다음과 같습니다. Windows 11에서 밝기를 변경하는 방법 [10가지 설명] 단일 모니터 사용자는 다음 방법을 사용하여 Windows 11에서 밝기를 조정할 수 있습니다. 여기에는 단일 모니터를 사용하는 데스크탑 시스템과 노트북이 포함됩니다. 시작하자. 방법 1: 알림 센터 사용 알림 센터에 액세스할 수 있습니다.

Windows Server에서 활성화 오류 코드 0xc004f069를 수정하는 방법 Windows Server에서 활성화 오류 코드 0xc004f069를 수정하는 방법 Jul 22, 2023 am 09:49 AM

Windows의 정품 인증 프로세스에서 갑자기 이 오류 코드 0xc004f069가 포함된 오류 메시지가 표시되는 경우가 있습니다. 활성화 프로세스가 온라인으로 진행되더라도 Windows Server를 실행하는 일부 이전 시스템에서 이 문제가 발생할 수 있습니다. 이러한 초기 점검을 수행하고 시스템 활성화에 도움이 되지 않으면 기본 해결 방법으로 이동하여 문제를 해결하십시오. 해결 방법 - 오류 메시지와 활성화 창을 닫습니다. 그런 다음 컴퓨터를 다시 시작하십시오. Windows 정품 인증 프로세스를 처음부터 다시 시도하세요. 수정 1 – 터미널에서 활성화 cmd 터미널에서 Windows Server Edition 시스템을 활성화합니다. 1단계 – Windows Server 버전 확인 현재 사용하고 있는 W 종류를 확인해야 합니다.

See all articles