位运算

来源:互联网 发布:快递员取件抢单软件 编辑:程序博客网 时间:2024/05/17 21:13

位运算 7句话概括:

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

 ② 正数原码,反码,补码都一样
 ③ 负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
 ④ 负数的补码=它的反码+1
 ⑤ 0的反码,补码都是0
 ⑥ php没有无符号数,换言之,php中的数都是有符号数

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


  二进制表示一个数,这个码就是原码

1 的源码 ----> 00000000  00000000  00000000 00000001

00000000  00000000  00000000  00000101  

=> 1*2的零次方 + 0 * 2的一次方 + 1*2的二次方  +0*2的零三方 + ...+ 0 +... =  1+0+4+0+..+0+.. = 5


-1  的源码 ----> 10000000  00000000  00000000  0000001

-1  的反码 ----> 11111111  11111111  11111111  11111110

-1  的补码 ----> 11111111  11111111  11111111  11111111


----------------------------------------------------------------------------------------------------------------------------------------------

   php中有4个位运算符,分别是“按位与&、按位或|、按位异或^,按位取反~”

 按位与&:   两位全为1,结果为1
 按位或|:     两位有一个为1,结果为1
 按位异或^:两位有一个为0,一个为1 ,结果为1
 按位取反~:0->1,1->0


 比如:  ~2=-3    2&3=2   2|3=2   2^3=1


echo ~2;  // -3


2 的源码:00000000  00000000  00000000  00000010 (正数的源码,反码,补码都一样)

2 取反:    11111111  11111111  11111111 11111101   (计算以补码方式运算,运算结果也是补码,需要转换成源码输出

其反码:   11111111  11111111  11111111  11111100   (负数的补码=反码+1,故反码=补码-1)

其源码:   10000000  00000000  00000000  00000011    (负数反码=它的源码符号位不变,其他位取反。理解成:负数源码=他的反码符号位不变,其他位取反)


输出值:-3


echo ~-5;  //  4


-5 的源码:10000000  00000000  00000000  00000101 

-5 的反码:11111111  11111111  11111111  11111010

-5 的补码:11111111  11111111  11111111  11111011


~-5 取反: 00000000  00000000  00000000  00000100


输出值: 4



2&3 首先找到 2 和 3 的补码
 2 的补码 00000000 00000000 00000000 00000010
 3 的补码 00000000 00000000 00000000 00000011
2&3          00000000 00000000 00000000 00000010【补码】


输出值:2


2|3 首先找到 2 和 3 的补码
 2 的补码 00000000 00000000 00000000 00000010
 3 的补码 00000000 00000000 00000000 00000011
2|3            00000000 00000000 00000000 00000011【补码】


输出值:3



 
2^3 首先找到 2 和 3 的补码
 2 的补码 00000000 00000000 00000000 00000010
 3 的补码 00000000 00000000 00000000 00000011
2^3           00000000 00000000 00000000 00000001【补码】


输出值:1


-----------------------------------------------------------------------------------------------------------------------------------------------------


php 中 移位运算符
>>(右移) <<(左移) 算数右移和算数左移,运算规则
算数右移:低位溢出,符号位不变,并用符号位补溢出位的高位
算数左移:符号位不变,低位补0


1>>2 
1 的补码 00000000 00000000 00000000 00000001


右移2位  ??000000 00000000 00000000 00000000 01
                00000000 00000000 00000000 00000000


输出值:0



-1>>2 
-1 的源码   10000000 00000000 00000000 00000001
-1 的反码   11111111 11111111 11111111 11111110
-1 的补码   11111111 11111111 11111111 11111111
右移2位     ??111111 11111111 11111111 11111111 11
                   11111111 11111111 11111111 11111111 【补码】
补码->反码->源码
其反码      11111111 11111111 11111111 11111110
其源码      10000000 00000000 00000000 00000001



输出值:-1



1<<2
1 的补码 00000000 00000000 00000000 00000001
左移2位  00 00000000 00000000 00000000 000001??
                00000000 00000000 00000000 00000100


输出值:4



其他方式依此类推。



0 0
原创粉丝点击