移位操作符如何在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 

有人可以解释吗?

 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从二进制十进制编号系统如下

 10 

现在如果你这样做

 2 << 11 

这将是,11个零将在右侧填充

 1000000000000 

带符号的左移运算符“<<”将位模式向左移位,并且带符号的右移运算符“>>”将位模式向右移位。 位模式由左侧操作数给出,位数由右侧操作数进行移位。 无符号右移运算符“>>>”将零移入最左边的位置,而“>>”之后的最左边位置取决于符号扩展[..]

左移将导致乘以2(* 2)或算术


例如

2在二进制10 ,如果你做<<1将是100 ,这是4

4在二进制100 ,如果你做<<1将是1000这是8


另见

  • 绝对初学者引导到比特移位

右转和左转同样的方式在这里工作是如何右移; 右移:右移操作符>>将值中的所有位向右移动指定的次数。 其一般forms:

 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 >> 1–4 ,二进制是

 11111000 –8 >>1 11111100 –4 

值得注意的是,如果右移-1,结果总是保持-1,因为符号扩展不断引入更多的高位。 有时,当你将它们移到右边时,不要求符号扩展值。 例如,以下程序将字节值转换为其hexstring表示forms。 请注意,移位后的值通过与0x0f进行AND操作来屏蔽掉任何符号扩展位,以便该值可用作hex字符数组的索引。

 // 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 

我相信这可能有助于:

  System.out.println(Integer.toBinaryString(2 << 0)); System.out.println(Integer.toBinaryString(2 << 1)); System.out.println(Integer.toBinaryString(2 << 2)); System.out.println(Integer.toBinaryString(2 << 3)); System.out.println(Integer.toBinaryString(2 << 4)); System.out.println(Integer.toBinaryString(2 << 5)); 

结果

  10 100 1000 10000 100000 1000000 

编辑:

必须阅读这个(如何做位运算的工作)

我认为这将是以下,例如:

  • 签署左派

[2 << 1]是=> [10(2的二进制)在二进制串的末尾添加1零]因此,10将成为100,成为4。

另外一个例子[ 2 << 11] = 2 *(2 ^ 11)= 4096

  • 签名右移

[4 >> 1]是=> [100(4的二进制)在二进制串的末尾除去1零)因此100将是10,变成2。

另外一个例子[ 4096 >> 11] = 4096 /(2 ^ 11)= 2

它将通过填充多个0's来移位这些位。

例如,

  • 数字2左移2二进制10是数字8 1000
  • 数字2左移2二进制10是数字16 10000

这个转换可以用数据types(char,int和long int)来实现。 float和double数据不会被移位。

 value= value >> steps // Right shift, signed data. value= value << steps // Left shift, signed data.