我looked in this question了解为什么在包括Java在内的大多数语言中都没有算术左移运算符。但是接下来我们如何处理负整数,因为左移会将它抛弃。以例如-2 ^ 5为例,结果应为负数。
答案 0 :(得分:9)
不,除非你提交溢出,否则左移不会抛出符号位。原因?在二进制补码编码中,负数在左侧有所有1,其中正数将全部为零。就像符号位被复制到右边一样。顺便说一下,这正是“符号扩展”一词有道理的原因,这就是默认右移在Java中的作用。
int i = -1;
System.out.format("%3d = %s\n", i, Integer.toBinaryString(i));
i <<= 5;
System.out.format("%3d = %s\n", i, Integer.toBinaryString(i));
打印
-1 = 11111111111111111111111111111111
-32 = 11111111111111111111111111100000
答案 1 :(得分:0)
我最好的答案是,只需在操作前后更改标志即可。它可能看起来太明显,但事实是当符号改变时,比特会以特定方式发生变化