我没有我的Java参考书,我很难找到谷歌的答案。
“>>”之间的区别是什么?和“>>>” Java中的运算符?
int value = 0x0100;
int result = (value >> 8);
System.out.println("(value >> 8) = " + result); // Prints: "(value >> 8) = 1"
result = (value >>> 8);
System.out.println("(value >>> 8) = " + result); // Prints: "(value >>> 8) = 1"
答案 0 :(得分:24)
有符号整数使用高位来表示符号。
因此>>
会保留该符号,而>>>
则不会。这就是为什么>>
被称为算术移位而>>>
是逻辑移位的原因。
这样,你可以做(假设32位整数)以下内容:
-10 >> 1
得到-5(0xFFFFFFF6 >> 1
得到0xFFFFFFFB - 注意高阶位保持不变。)-10 >>> 1
得到2147483643(0xFFFFFFF6 >>> 1
得到0x7FFFFFFB - 注意所有的位都被移位了,所以高阶位现在为零。根据二进制补码,这个数字不再是负数。 )对于正整数,>>
和>>>
的行为相同,因为高位已经为零。
它还解释了为什么不需要<<<
运算符。由于符号会通过向左滑动来进行删除,因此它将映射到没有合理的算术运算。
答案 1 :(得分:16)
>>>
为logical shift,>>
为arithmetic shift。
答案 2 :(得分:9)
来自Java Notes: Bitwise Operators:
n&gt;&gt; p (右移) 移动n个右p位的位。如果n是2的补码有符号数,则符号位将移入高位。
示例: 5&gt;&gt; 2 = 1
n&gt;&gt;&gt; p (右移) 移动n个右p位的位。零被转移到高阶位置。
示例: -4&gt;&gt;&gt; 28 = 15
答案 3 :(得分:5)
对于正数,没有区别。对于&gt;&gt;&gt;,负数(二进制补码)数字将用零填充和>>&gt;。
1010 0110&gt;&gt;&gt; 2 = 0010 1001
1010 0110&gt;&gt; 2 = 1110 1001
答案 4 :(得分:4)
正确答案已多次发布,但不是来自权威来源。
这来自JLS §15.19 Shift Operators:
移位运算符包括左移
<<
,右移>>
和无符号右移>>>
;它们在语法上是左关联的(它们从左到右分组)。移位运算符的左侧操作数是要移位的值;右侧操作数指定移位距离。...
n>>s
的值是带有符号扩展名的n
右移s
位位置。结果值为⌊ n / 2 s ⌋。对于n
的非负值,这相当于将由整数除法运算符/
计算的整数除法截断为2,除以幂s
。
n>>>s
的值为n
右移s
位位置,零扩展。如果n
为正数,则结果与n>>s
的结果相同;如果n
为负数,则结果等于表达式(n>>s)+(2<<~s)
的结果(如果左侧操作数的类型为int
),结果等于表达式(n>>s)+(2L<<~s)
的结果如果左侧操作数的类型是long
。添加的术语(2<<~s)
或(2L<<~s)
会取消传播的符号位。 (请注意,由于隐式屏蔽了移位运算符的右侧操作数,~s
作为移位距离相当于31-s
移位int
时的63-s
和long
1}}在移动{{1}}值时。)
答案 5 :(得分:2)
&gt;&gt;是一个算术移位,它保留任何“空”位中的符号位。另一个是逻辑转变,用零填充空白点。
答案 6 :(得分:0)
一些info
&gt;&gt;运算符保留最左边的位。最左边的位用前面的内容填充。这与标志扩展有关。在这种情况下,左边有一个1并保留。如果您不想将1保留在左侧,请使用&gt;&gt;&gt;将0移到最左边的位的运算符
答案 7 :(得分:0)
它与有符号值数学有关。对于高位位,>>>
以零为单位,>>
保留符号位并将其拉入。
答案 8 :(得分:0)
算术移位&gt;&gt;对于有符号整数除以2,而逻辑移位&gt;&gt;&gt;对于无符号数,则除以2(如果将已签名的Java int中的位模式解释为无符号整数)。