99

0x00 问题

关于上上周学习java中遇到的符号位移问题。

>> 带符号右移 高效除2
<< 带符号左移 高效乘2
>>> 不带符号右移
关于带符号位移这块已经是了解了,但是对不带符号移动,当时可能记错了>>>带符号,理解不够深入,今天听见组长的一番解释,自己手动敲了一波,算是搞懂了,阔以填坑了

0x01 解决

代码

int b = -0x400;
System.out.println(b >>> 1);
//1111 1111 1111 1111 1111 1100 0000 0000
System.out.println(Integer.toBinaryString(b));
//1111 1111 1111 1111 1111 1100 0000 000
System.out.println(Integer.toBinaryString(b >>> 1));

复盘

b = 1111 1111 1111 1111 1111 1100 0000 0000
b>>>1 = 1111 1111 1111 1111 1111 1100 0000 000

1111 1111 1111 1111 1111 1100 0000 0000
1111 1111 1111 1111 1111 1100 0000 000

因为是不带符号移动,b为负数,负数符号位为1,正数符号位为0
1111 1111 1111 1111 1111 1100 0000 0000
向右移动一位,不带符号,不需要填充,所以变成
111 1111 1111 1111 1111 1110 0000 0000
1111 1111 1111 1111 1111 1100 0000 000

之前有点钻牛角尖了,然后也理解错了,这个坑终于填了,阔以的,感谢组长。