【PHP基础】位运算与原码,反码,补码

对于有符号的而言:
   ①二进制的最高位是符号位: 0表示正数,1表示负数
   ②正数的原码,反码,补码都一样
   ③负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
   ④负数的补码=它的反码+1
   ⑤0的反码,补码都是0
   ⑥php没有无符号数,换言之,php中的数都是有符号的
   ⑦在计算机运算的时候,都是以补码的方式来运算的.  

php中有4个位运算,分别是”按位与&、按位或|、按位异或^,按
位取反~”,它们的运算规则是:
   按位与& : 两位全为1,结果为1
   按位或|  :   两位有一个为1,结果为1
   按位异或 ^ : 两位一个为0,一个为1,结果为1
   按位取反 :   0->1 ,1->0


练习题:
一、       ~-5=?


a.   先找-5的原码     10000000  00000000  00000000  00000101
b.   再找-5的反码     11111111  11111111  11111111  11111010           【原码符号位不变,其它位取反(0->1,1->0)】
c.         -5的补码     11111111  11111111  11111111  11111011            【反码+1】
d.  按位取反运算~    00000000  00000000  00000000  00000100             【这并不是一个最终结果因为在计算机运算的时候,都是以补码的方式来运算的。所以这一步依然是个补码】
e.  由d能看出这个数是正数,正数的原码,反码,补码都一样,所以  结果就是00000000  00000000  00000000  00000100,   即  ~-5=4


二、         2&3=?
a.   2的补码     00000000  00000000  00000000  00000010  
b.   3的补码     00000000  00000000  00000000  00000011
c.按位与运算     00000000  00000000  00000000  00000010      所以结果是    2&3=2


三、        2|3=?
前两步同上,结果是   00000000  00000000  00000000  00000011    结果是  2|3=3        

四、        2^3=?

前两步同上,结果是   00000000  00000000  00000000  00000001    结果是 2^3=1

五、        ~2=?
a.          2的补码     00000000  00000000  00000000  00000010
b.          取反运算    11111111  11111111  11111111  11111101   【这一步得到的是运算之后那个数的补码,并不是最终结果】
c.负数的补码推反码   11111111  11111111  11111111  11111100    【补码-1等于反码】
d.负数的反码推原码   10000000  00000000  00000000  00000011    所以  ~2= -3

一个小规律,一个数取反就等于它的相反数再减1。

自己推算    13&7=5   5|4=5   -3^3=-2

你可能感兴趣的:(php基础)