PHP位运算

来源:互联网 发布:名侦探柯南主线知乎 编辑:程序博客网 时间:2024/06/11 20:47

1、二进制的基本概念。

1、二进制的最高位是符号位:0 表示正数,1表示负数

2、正数的原码、反码、补码都一样

3、原码既是它的二进制数据

4、负数的反码等于它的原码符号不变,其他位取反(0变1,1变0)

5、负数的补码等于它的反码加1

6、0的反码、补码都是0

7、在计算机运算的时候,都是以补码的方式来运算的。

 

2、位运算的基本概念

1、$a & $b     按位与 ,将把$a 和$b中 都为1的位设为1

2、$a | $b       按位或 ,将把$a 或者$b中为1的位设为1

3、$a ^ $b       按位异或 ,将把$a 和$b中不同的位设为1,既两个位都不相同即为1.

4、~$a             按位取反 ,将把$a 为0的位设为1,为1的位设为0

5、$a<<$b      左移,将$a中的位向左移动$b次 (每一次移动都表示乘以2)

6、$a>>$b      右移,将$a中的位向右移动$b次 (每一次移动都表示除以2)

   算术左移 :符号位不变,低位补0

   算术右移 :符号不变,低位溢出,并用符号位补溢出的高位

3 、实战

计算

2&3= ?

PHP中一个整数占4个字节32位。

1、2的原码为 00000000 00000000 00000000 00000010,正数的反码、补码和原码一样

2、3的原码      00000000 00000000 00000000 00000011,正数的反码、补码和原码一样

3、将2的补码和3的补码进行按位与运算,即将00000000 00000000 00000000 00000010和00000000 00000000 00000000 00000011都为1的位设为1

计算的结果补码为00000000 00000000 00000000 00000010

4、将按位与运算完后的补码转换成原码、将原码转为10进制数据,所以结果为2

 

~2 =  ?

1、2的原码为 00000000 00000000 00000000 00000010,正数的反码、补码和原码一样

2、将补码取反,结果为  11111111 11111111 11111111 11111101 

3、将补码转成反码,最高位1不动、表示符号负数,因为负数的补码是由反码加1得到,所以补码转成反码就是减1,反码为11111111 11111111 11111111 11111100

4、将反码转成原码,负数的反码是原码的取反,符号位不变,所以反码转原码亦一样,原码为 10000000 00000000 00000000 00000011

5、将原码转为10进制数据,结果为- 3

 

读者可以尝试计算下列数据

2 | 3 =  3

2的原码,反码、补码00000000 00000000 00000000 00000010

3的原码,反码、补码00000000 00000000 00000000 00000011

2 | 3的原码,反码、补码00000000 00000000 00000000 00000011

 

~ - 5 =4

-5

原码 10000000 00000000 00000000 00000101

反码          11111111 11111111 11111111 11111010

补码           11111111 11111111 11111111 11111011

~ - 5

补码  00000000 00000000 00000000 00000100

反码  00000000 00000000 00000000 00000100

原码 00000000 00000000 00000000 00000100

结果为4                                 

 

-3 ^ 3 = -2

-3的原码 10000000 00000000 00000000 00000011 反码 11111111 11111111 11111111 11111100

                              补码 11111111 11111111 11111111 11111101

3的原码、反码、补码 00000000 00000000 00000000 00000011

-3 ^ 3 的补码                  11111111 11111111 11111111 11111110

反码11111111 11111111 11111111 11111101

原码10000000 00000000 00000000 00000010

 

-1 << 2 = -4

-1 的原码 10000000 00000000 00000000 00000001

反码           11111111 11111111 11111111 11111110

补码            11111111 11111111 11111111 11111111

-1 << 2 向左移动2位,符号位不变,低位补0,结果为 11111111 11111111 11111111 11111100

反码 11111111 11111111 11111111 11111011

原码   10000000 00000000 00000000 00000100

结果为 -4

 

-1 >> 2 = -1

-1 的原码 10000000 00000000 00000000 00000001

反码           11111111 11111111 11111111 11111110

补码            11111111 11111111 11111111 11111111

-1 >>2 向右移动2位,符号位不变,高位溢出,溢出位由符号位补齐,结果为

11111111 11111111 11111111 11111111

反码 11111111 11111111 11111111 11111110

原码   10000000 00000000 00000000 00000001

结果为 -1

 

 

 

 

 

 

 

 

 

 

原创粉丝点击