Nat*_*ate 17 java bit-manipulation operators
我没有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"
Run Code Online (Sandbox Code Playgroud)
lav*_*nio 24
有符号整数使用高位来表示符号.
所以>>保留标志,而>>>不是.这就是为什么>>被称为算术移位并且>>>是逻辑移位.
这样,你可以做(假设32位整数)以下内容:
-10 >> 1产量-5(0xFFFFFFF6 >> 1产生0xFFFFFFFB - 注意高阶位保持不变.)-10 >>> 1产生2147483643(0xFFFFFFF6 >>> 1产生0x7FFFFFFB - 注意所有位都被移位,所以高位比特现在为零.根据二进制补码,这个数字不再是负数.)对于正整数,>>并且>>>行为相同,因为高位已经为零.
它还解释了为什么不需要<<<操作员.由于符号会通过将位滑动到左侧而被破坏,因此它将映射到没有合理的算术运算.
n >> p (右移)移位 n个右p位的位.如果n是2的补码有符号数,则符号位移入高位.
示例: 5 >> 2 = 1
n >>> p (右移)移位 n个右p位的位.零被转移到高阶位置.
示例: -4 >>> 28 = 15
正确答案已发布多次,但并非来自权威机构。
这是从JLS §15.19移位操作:
该移位运算符包括左移位
<<,签署右移位>>,和无符号右移>>>; 它们在语法上是左联想的(它们的组从左到右)。移位运算符的左操作数是要移位的值;右侧操作数指定移位距离。...
的值
n>>s是带符号扩展名的n右移位s。所得到的值是⌊ ñ / 2 小号 ⌋。对于的非负值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的值)。
对于正数,没有区别。负数(二进制补码)将用>>>的零填充和>>的数字。
1010 0110 >>> 2 = 0010 1001
1010 0110 >> 2 = 1110 1001