位运算:
一、先求出二进制:
-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 &#61;> 1 <1> 000 &#61;> 11000 //当然&#xff0c;前面还可以补许多1&#xff0c;但没意义&#xff0c;只要位数够运算就行
-2 &#61;> 1 <1> 00 &#61;> 11100
11000
11100
11000//结果补码&#xff0c;结果便是&#xff1a;1000 &#61;> 8 取负,-8
三、按位或| &#xff1a;除去符号位&#xff0c;有1为1
例&#xff1a;-3|-6
-3 补码&#xff1a;11111101
-6 补码&#xff1a;11111010
结果补码&#xff1a;11111111
结果反码&#xff1a;11111110//补码减1
结果原码&#xff1a;00000001 //反码再求反&#xff0c;-1
总结&#xff1a;
1、有负为负。
四、按位异或^ :相异为1&#xff0c;相同为0
例&#xff1a;-3^-6
-3 补码&#xff1a;11111101
-6 补码&#xff1a;11111010
结果补码&#xff1a;00000111//已然为正&#xff0c;故为7
总结&#xff1a;同号为正&#xff0c;异号为负。
五、按位取反~ &#xff1a;0、1互换
例&#xff1a;~-3
-3 补码&#xff1a;11111101
结果补码&#xff1a;00000010//已然为正&#xff0c;故为2
总结&#xff1a;正负相换。
六、按位右移>> : 排除符号位&#xff0c;二进制数整体向右移动。
7 >> 2 &#61;> 0111 &#61;> 0001 &#61; 1 // 这里向右移动了2位&#xff0c;最低位的两个1被抹去。
七、按位左移<<: 与上同理。
7 <<2 &#61;> 0111 &#61;> 011100 &#61; 28 // 这里向右移动了2位&#xff0c;最低位的两个1被抹去。
总结&#xff1a;右移两位等于除了2的二次方&#xff0c;7/4 &#61; 1 在整数除法中则看成是被舍掉了小数部分。左移就是剩以2的二次方,PHP没有无符号右移运算符>>>