位运算

一、二进制原码、反码、补码
1:二进制的最高位是符号位:0表示正数,1表示负数。

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

3:负数的反码=它的原码符号位不变,其他位取反(0变1,1变0)。

4:负数的补码=它的反码+1。

5:0的反码,补码都是0。

6:php没有无符号数,php中的数都是有符号的。

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

二、位运算
1:按位与& :两位全为1,结果为1

2:按位或| :两位有一个为1,结果为1

3:按位异或^:两位一个为0,一个为1,结果为1

4:按位取反~:0变1,1变0

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

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

例:~2=-3 2&3=2 2|3=3 2^3=1;

题目:
13&7=?
13补码:00000000 00000000 00000000 00001101
7补码:00000000 00000000 00000000 00000111
13&7:00000000 00000000 00000000 00000101 =5 两位全为1,结果为1

5|4=?
5补码:00000000 00000000 00000000 00000101
4补码:00000000 00000000 00000000 00000100
5|4:00000000 00000000 00000000 00000101 =5 两位有一个为1,结果为1

-3^3=?
-3原码:10000000 00000000 00000000 00000011
-3反码:11111111 11111111 11111111 11111100
-3补码:11111111 11111111 11111111 11111101
3补码:00000000 00000000 00000000 00000011
-3^3:11111111 11111111 11111111 11111110 =-2 两位一个为0,一个为1,结果为1

$a=1>>2;
1的补码:00000000 00000000 00000000 00000001
1>>2:00000000 00000000 00000000 00000000 =0 低位溢出,符号位不变,并用符号位补溢出的高位

$a=-1>>2;
-1的原码:10000000 00000000 00000000 00000001
-1的反码:11111111 11111111 11111111 11111110
-1的补码:11111111 11111111 11111111 11111111
-1>>2:11111111 11111111 11111111 11111111 (补码)低位溢出,符号位不变,并用符号位补溢出的高位
结果:
补码->原码
反码:11111111 11111111 11111111 11111110
原码:10000000 00000000 00000000 00000001 =-1

1<<2
1的补码:00000000 00000000 00000000 00000001
1<<2:  00000000 00000000 00000000 00000100 =4 符号位不变,低位补0

 

 

 

 

posted @ 2014-01-22 16:25  Vanling  阅读(135)  评论(0编辑  收藏  举报