轮班操作员如何在Java中工作?

问题

我试图了解班次运营商,并没有得到太多。当我尝试执行以下代码时

System.out.println(Integer.toBinaryString(2 << 11));
System.out.println(Integer.toBinaryString(2 << 22));
System.out.println(Integer.toBinaryString(2 << 33));
System.out.println(Integer.toBinaryString(2 << 44));
System.out.println(Integer.toBinaryString(2 << 55));

我得到以下内容

1000000000000    
100000000000000000000000    
100    
10000000000000    
1000000000000000000000000

有人可以解释一下吗?


#1 热门回答(181 赞)

System.out.println(Integer.toBinaryString(2 << 11));

将二进制2(10)向左移动11次。因此:1000000000000

System.out.println(Integer.toBinaryString(2 << 22));

将二进制2(10)向左移动22次。因此:100000000000000000000000

System.out.println(Integer.toBinaryString(2 << 33));

现在,int是4个字节,因此是32位。所以当你换33时,相当于换班1.因此:100


#2 热门回答(31 赞)

二进制的十进制编号系统中的2如下

10

现在,如果你这样做

2 << 11

它会在右侧填充11个零

1000000000000

带符号的左移运算符"<<"将位模式向左移位,带符号的右移运算符">>"将位模式向右移位。位模式由左侧操作数给出,以及由右侧操作数移位的位置数。无符号右移运算符">>>"将零移动到最左边的位置,而">>"后面的最左边位置取决于符号扩展[...]

左移使得术语或算术乘以2(* 2)

例如

2在二进制10中,如果你做6482760046那将是100,这是4

4在binary100,如果你做<<1那将是1000,这是4666659436
另请参阅-绝对初学者 - 指导到位移位


#3 热门回答(15 赞)

左右移位的工作原理是右移和右移如何工作;右移:右移位运算符>>将值中的所有位向右移动指定的次数。其一般形式:

value >> num

这里,num指定右移值的位置数。也就是说,>>将指定值中的所有位向右移动num指定的位位置数。以下代码片段将值32向右移动两个位置,从而将值设置为8:

int a = 32;
a = a >> 2; // a now contains 8

当某个值具有"移位"的位时,这些位将丢失。例如,下一个代码片段将值35移位到右边的两个位置,这导致两个低位比特丢失,再次导致设置为8。

int a = 35;
a = a >> 2; // a still contains 8

查看二进制中的相同操作更清楚地显示了这种情况:

00100011 35 >> 2
00001000 8

每次将值向右移动时,它会将该值除以2,并丢弃任何余数。你可以利用此优势将高性能整数除以2.当然,你必须确保不要将任何位移出右端。当你向右移动时,右移显示的顶部(最左侧)位将填充顶部位的先前内容。这称为符号扩展,用于在向右移动时保留负数的符号。例如,–8 >> 1is–4,二进制,是

11111000 –8 >>1
11111100 –4

有趣的是,如果你向右移动-1,结果总是保持-1,因为符号扩展会在高位中引入更多的符号。有时,当你将值向右移动时,不希望对值进行符号扩展。例如,以下程序将字节值转换为其十六进制字符串表示形式。请注意,移位值通过与0x0f进行AND运算来屏蔽,以丢弃任何符号扩展位,以便该值可用作十六进制字符数组的索引。

// Masking sign extension.
class HexByte {
  static public void main(String args[]) {
    char hex[] = {
      '0', '1', '2', '3', '4', '5', '6', '7',
      '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
    };
  byte b = (byte) 0xf1;
 System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
}
}

这是该程序的输出:

b = 0xf1