Discuss / Java / 右移这里确定没写错吗?

右移这里确定没写错吗?

Topic source

有符号的右移应该前面是补1,所以这里是不是写错了?

int n = -536870912;
int a = n >> 1;  // 11110000 0000000 0000000 00000000 <= -268435456
int b = n >> 2;  // 10111000 0000000 0000000 00000000 <= -134217728
int c = n >> 28; // 10000000 0000000 0000000 00000001 <= -2
int d = n >> 29; // 10000000 0000000 0000000 00000000 <= -1

这里应该是这样才对吧?

int n = -536870912;
int a = n >> 1;  // 11110000 0000000 0000000 00000000 <= -268435456
int b = n >> 2;  // 11111000 0000000 0000000 00000000 <= -134217728
int c = n >> 28; // 11111111 1111111 1111111 11111110 <= -2
int d = n >> 29; // 11111111 1111111 1111111 11111111 <= -1

vth1311

#2 Created at ... [Delete] [Delete and Lock User]

应该是写错了,查阅了一些资料,而且自己验证了一下,廖老师解释的不通。

小锻basara

#3 Created at ... [Delete] [Delete and Lock User]

右移前面不是补1,第一位的0或1表示的是正负,使用>>的时候第一位是正负是不会移动的。不论左移还是右移空出来的位置都是补0.

应该是写错了,试了一下10111000 00000000 00000000 00000000的结果并不是-134217728,11111000 00000000 00000000 00000000的结果才是


关于右移,感觉老师解释得不太清楚 - 其实,>> 和 >>> 符号位都会跟着走的,只是 >> 的话,补码是符号位,如果>>>的话,补码永远是0。

有大佬路过嘛?我想知道移位运算,在以后的学习或开发中,有哪些应用场景呢?或者说移位运算重要性怎样呢?

移位运算首先要明确的是在计算机中正数用二进制原码表示的,负数用补码表示的。在右移时,补码是符号位;在左移时,补码永远都是0;而无符号移位只有右移,没有左移,补码永远都是0。记忆的话只要记住**“右移补符其它补0”**即可。

左移实际上就是不断地×2,右移实际上就是不断地÷2。 

有什么问题?????

東NANIAN

#9 Created at ... [Delete] [Delete and Lock User]

一个逻辑右移,不看符号位,一个算术右移,符号位不变。

東NANIAN

#10 Created at ... [Delete] [Delete and Lock User]

7楼的朋友,你说的不太正确,正数原反补相同,负数不同,所以正数和负数都是以补码形式存储的,而右移分为逻辑右移和算术右移,逻辑右移不关注符号位,高位补0,但算术右移关注符号位,正数符号位是0,所以补0,负数符号位是1,所以补1,而不是右移其他位补0;


  • 1
  • 2

Reply