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