我试图了解班次运营商,并没有得到太多.当我尝试执行以下代码时
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));
Run Code Online (Sandbox Code Playgroud)
我得到以下内容
1000000000000
100000000000000000000000
100
10000000000000
1000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
Kaz*_*ara 205
System.out.println(Integer.toBinaryString(2 << 11));
Run Code Online (Sandbox Code Playgroud)
将二进制2(10)向左移动11次.因此:1000000000000
System.out.println(Integer.toBinaryString(2 << 22));
Run Code Online (Sandbox Code Playgroud)
将二进制2(10)向左移动22次.因此:100000000000000000000000
System.out.println(Integer.toBinaryString(2 << 33));
Run Code Online (Sandbox Code Playgroud)
现在,int是4个字节,因此是32位.所以当你换班33时,相当于换班1.因此:100
Jig*_*shi 38
二进制的十进制编号系统中的2如下
10
Run Code Online (Sandbox Code Playgroud)
现在,如果你这样做
2 << 11
Run Code Online (Sandbox Code Playgroud)
它会在右侧填充11个零
1000000000000
Run Code Online (Sandbox Code Playgroud)
带符号的左移运算符"<<"将位模式向左移位,带符号的右移运算符">>"将位模式向右移位.位模式由左侧操作数给出,位置数由右侧操作数移位.无符号右移运算符">>>"将零移动到最左边的位置,而">>"后面的最左边位置取决于符号扩展[...]
左移使得术语或算术乘以2(*2)
例如
二进制2 10,如果你这样做<<1将100是4
4二进制100,如果你这样做 <<1将1000是8
另见
sta*_*bit 14
左右移位的工作原理是右移和右移如何工作; 右移:右移位运算符>>将值中的所有位向右移动指定的次数.其一般形式:
value >> num
Run Code Online (Sandbox Code Playgroud)
这里,num指定右移值的位置数.也就是说,>>将指定值中的所有位向右移动num指定的位位置数.以下代码片段将值32向右移动两个位置,从而将值设置为8:
int a = 32;
a = a >> 2; // a now contains 8
Run Code Online (Sandbox Code Playgroud)
当某个值具有"移位"的位时,这些位将丢失.例如,下一个代码片段将值35移位到右边两个位置,这导致两个低位比特丢失,再次导致设置为8.
int a = 35;
a = a >> 2; // a still contains 8
Run Code Online (Sandbox Code Playgroud)
查看二进制中的相同操作更清楚地显示了这种情况:
00100011 35 >> 2
00001000 8
Run Code Online (Sandbox Code Playgroud)
每次将值向右移动时,它会将该值除以2,并丢弃任何余数.你可以利用这个来实现2的高性能整数除法.当然,你必须确保你没有将任何位移到右端.向右移动时,右移显示的顶部(最左侧)位用顶部位的先前内容填充.这称为符号扩展,用于在向右移动时保留负数的符号.例如,–8 >> 1是–4,二进制,是
11111000 –8 >>1
11111100 –4
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果向右移动-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]);
}
}
Run Code Online (Sandbox Code Playgroud)
这是该程序的输出:
b = 0xf1
Run Code Online (Sandbox Code Playgroud)
Kha*_*lam 13
我相信这可能会有所帮助:
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));
Run Code Online (Sandbox Code Playgroud)
结果
10
100
1000
10000
100000
1000000
Run Code Online (Sandbox Code Playgroud)
编辑:
小智 7
我认为这将是以下,例如:
[2 << 1]是=> [10(二进制2)在二进制字符串的末尾加1]因此10将是100,变为4.
有符号左移使用乘法...所以这也可以计算为2*(2 ^ 1)= 4.另一个例子[ 2 << 11] = 2*(2 ^ 11)= 4096
[4 >> 1] is => [100(二进制4)在二进制字符串的末尾删除1个零]因此100将是10,变为2.
签名右移使用除法......所以这也可以计算为4 /(2 ^ 1)= 2另一个例子[ 4096 >> 11] = 4096 /(2 ^ 11)= 2