此文皆为本人观点,有不足的地方望指出!
由于在计算机中负数以补码存在,故开始时,我们的先把负数的原码变补码在开始操作。
左移位:<<,有符号的移位操作
左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充右移位:>>,有符号的移位操作
右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是正数用0补充,负数用1补充。
无符号右移(注意:并没有无符号左移):>>> 无符号右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用全都用0 填充。
无符号右移不管正负号,移完后全都补0,这时候在把移完后的2进制转换为10进制,即为结果,这个数很大啊!
正数左移或者右移后的2进制转换为10进制即为结果。
负数左移或者右移时先取反(符号位不变)加1后,再左移或者右移,在取反(符号位不变)加1变成补码后,再转化为10进制。
补码 = 反码 + 1;
总结:除了1,-1右移2位(以移2位为例)结果为:0,-1外,他的左移结果为相反数!(4与-4)
即:正整数与负整数左移结果为相反数,正整数与负整数右移结果也为相反数,且正整数左移,右移后结果为正数,负整数移动后结果为负数(yw他们并不改变符号位!)
无符号右移的结果和正整数右移结果一样(以上皆是在移动位数相同情况下成立),且由于无符号右移不在乎符号之分,所以不管是正数或者负数,他们右移后的结果都为正数
如12>>2 = 3, -12>>2 = -3;12>>>2=3;
现在举例说明:
12<<2 = 48(12左移2位结果为48) 00000000 00000000 00000000 0000 1100 为12的二进制,现在把12左移2位变为:00000000 00000000 00000000 0011 0000
在转化为十进制为:48
12>>2 = 3 00000000 00000000 00000000 0000 1100 为12的二进制,现在把12右移2位变为: 00000000 00000000 00000000 0000 0011在把其转化为十进制为:3
-12 >>2 = - 3 由上知负数左移或者右移时先取反加1,即:10000000 00000000 00000000 0000 1100 为12的原码,取反为:11111111 11111111 11111111 1111 0011,在加1为:11111111 11111111 11111111 1111 0100,在把-12左移2位为:11111111 11111111 11111111 1111 1101,在取反加1为:100000000 00000000 00000000 0000 0011转换为十进制为:-3
12>>>2 = 3 12的无符号右移与12的右移结果一样为:3
-12>>>2 = 1073741821 由上知负数左移或者右移时先取反加1,即:10000000 00000000 00000000 0000 1100 为-12的原码,取反(符号位不变)为:11111111 11111111 11111111 1111 0011,在加1为:11111111 11111111 11111111 1111 0100,在把-12右移2位为:00111111 11111111 11111111 1111 1101,在把他转化为十进制为:1073741821