shift 运算符在 Java 中是如何工作的?

2022-08-31 07:27:20

我试图了解轮班操作员,但无法获得太多。当我尝试执行以下代码时

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
System.out.println(Integer.toBinaryString(2 << 11)); 

将二进制 2() 向左移动 11 倍。因此:101000000000000

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

将二进制 2() 向左移动 22 倍。因此:10100000000000000000000000

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

现在,int 是 4 个字节,因此是 32 位。因此,当您移动33时,它相当于移动1。因此:100


答案 2

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

10

现在,如果您这样做

2 << 11

它将是,11个零将被填充在右侧

1000000000000

签名的左移位运算符“<<”向左移动位模式,签名的右移位运算符“>>”向右移动位模式。位模式由左侧操作数给出,而要由右侧操作数移动的位置数给出。无符号的右移位运算符“>>>”将零移位到最左边的位置,而“>>”之后的最左边位置取决于符号扩展名 [..]

左移导致在项或算术上乘以 2 (*2)


例如

2 在二进制中,如果你这样做,那将是10<<11004

4 在二进制中,如果你这样做,那将是100<<110008


另请参见


推荐