-
PHP 位运算
位运算:
一、先求出二进制:
-3原码: 10000000 00000000 00000000 00000011
-3反码: 11111111 11111111 11111111 11111100 //取反,但符号位不变。
-3补码: 11111111 11111111 11111111 11111101 //反码加1
注意:
1、正数的原码、反码、补码都是一样的。
2、计算机运算是以补码形式进行的,故计算时先统一转成补码,计算后(补码)逆转成原码。
二、按位与& :除去符号位,同1为1。
例:-3&2
-3 补码:11111111 11111111 11111111 11111101
2 补码:00000000 00000000 00000000 00000010
结果补码:00000000 00000000 00000000 00000000//最高位也参与运算,因为一正一负,总得有个了断吧
结果:0,由于正数三码统一,故处已是结果,补码即原码。
例:-3&-6
-3 补码:11111111 11111111 11111111 11111101
-6 补码:11111111 11111111 11111111 11111010
结果补码:11111111 11111111 11111111 11111000
结果反码:11111111 11111111 11111111 11110111//补码减1
结果原码:10000000 00000000 00000000 00001000 //反码再求反之后,-8
总结:
1、有正为正。
2、在结果为负,并且左边全是1,右边全是0,则结果从最后一个 1 取到最后,即:11111000 => 1000 => 8 => -8
2、当一个负数是2^n时,它的补码:补码等于原码有效数字所位,前补1,后补0。
-8 => 1 <1> 000 => 11000 //当然,前面还可以补许多1,但没意义,只要位数够运算就行
-2 => 1 <1> 00 => 11100
11000
11100
11000//结果补码,结果便是:1000 => 8 取负,-8
三、按位或| :除去符号位,有1为1
例:-3|-6
-3 补码:11111101
-6 补码:11111010
结果补码:11111111
结果反码:11111110//补码减1
结果原码:00000001 //反码再求反,-1
总结:
1、有负为负。
四、按位异或^ :相异为1,相同为0
例:-3^-6
-3 补码:11111101
-6 补码:11111010
结果补码:00000111//已然为正,故为7
总结:同号为正,异号为负。
五、按位取反~ :0、1互换
例:~-3
-3 补码:11111101
结果补码:00000010//已然为正,故为2
总结:正负相换。
六、按位右移>> : 排除符号位,二进制数整体向右移动。
7 >> 2 => 0111 => 0001 = 1 // 这里向右移动了2位,最低位的两个1被抹去。
七、按位左移<< : 与上同理。
7 << 2 => 0111 => 011100 = 28 // 这里向右移动了2位,最低位的两个1被抹去。
总结:右移两位等于除了2的二次方,7/4 = 1 在整数除法中则看成是被舍掉了小数部分。左移就是剩以2的二次方,PHP没有无符号右移运算符>>>