左移操作员如何保留标志?

Gee*_*eek 3 java bit-manipulation bit-shift bit

查看了这个问题,以了解为什么在包括Java在内的大多数语言中都没有算术左移运算符.但是接下来我们如何处理负整数,因为左移会将它抛弃.例如-2 ^ 5,其结果应为负数.

Mar*_*nik 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));
Run Code Online (Sandbox Code Playgroud)

版画

 -1 = 11111111111111111111111111111111
-32 = 11111111111111111111111111100000
Run Code Online (Sandbox Code Playgroud)