PHP位运算符详解

2017-12-02 23:38:00
linefo
原创
1380
进行二进制层面的操作

【准备知识】

需要了解原码、补码、反码的知识:原码、补码、反码详解

这里以8位计算机为例

符号:&(按位与)
说明:将把 $a 和 $b 中都为 1 的位设为 1。
详解:
( 0 = 0000 0000) = ( 0 = 0000 0000) & ( 5 = 0000 0101)
( 1 = 0000 0001) = ( 1 = 0000 0001) & ( 5 = 0000 0101)

符号:|(按位或)
说明:将把 $a 和 $b 中任何一个为 1 的位设为 1。
详解:
( 5 =0000 0101) = ( 0 = 0000 0000) | ( 5 = 0000 0101)
( 5 = 0000 0101) = ( 1 = 0000 0001) | ( 5 = 0000 0101)
有这些特质:
a | a = a
a | na = a+na(n>1)

符号:^(按位异或)
说明:将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
详解:
( 5 = 0000 0101) = ( 0 = 0000 0000) ^ ( 5 = 0000 0101)
( 4 = 0000 0100) = ( 1 = 0000 0001) ^ ( 5 = 0000 0101)

符号:~(按位取反)
说明:将 $a 中为 0 的位设为 1,反之亦然。
详解:
~ ( 8 = 0000 1000) => (1111 0111)
(1111 0111)第一位为符号位,这是一个负数,在计算机中,负数是用(2的)补码表示的
因为(1111 0111)是某个数的补码,根据补码的机制,先-1=>(1111 0110),然后非符号位(第一位)取反
=> (1000 1001) => -9,所以~8 = -9

符号:<<(左移)
说明:将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
详解:
8(0000 1000) = 4(0000 0100) << 1


符号:>>(右移)
说明:将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。
详解:
2(0000 0010) = 4(0000 0100) >> 1
1(0000 010) = 4(0000 0100) >> 2
0(0000 000) = 4(0000 0100) >> 3
-2(1111 1110) = -4(1111 1100) >> 1

【tip】
位运算操作的是二进制值,这里看更多例子
echo 12 ^ 9 // 输出5
echo "12" ^ "9" // 这里实质是(ascii 8)

文章分类
联系我们
联系人: Mr.Chen
QQ: 185391277