java中关于十进制数左移,右移,无符号右移问题解决

此文皆为本人观点,有不足的地方望指出!

由于在计算机中负数以补码存在,故开始时,我们的先把负数的原码变补码在开始操作。


左移位:<<,有符号的移位操作

左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用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 


由于在计算机中负数以补码存在,故开始时,我们的先把负数的原码变补码在开始操作。

版权声明:本文为u012759397原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。