Java的右移涉及带符号右移(>>)、不带符号右移(>>>)。
对于正数,因为符号位是0,带符号右移和不带符号右移左侧都用0填充,所以结果相同。
对于负数,因为符号位是1,带符号右移左侧是用1填充,而不带符号右移左侧是用0填充,所以带符号右移和不带符号右移的结果不同。
代码示例:
package com.thb;
public class Test1 {
public static void main(String[] args) {
// 对于正数,带符号右移和不带符号右移的值相同
System.out.println("正数带符号右移和不带符号右移验证:");
System.out.println("要移位的初始值:" + 0x40000000);
System.out.println("正数带符号右移:" + Integer.toHexString(0x40000000 >> 1));
System.out.println("正数不带符号右移:" + Integer.toHexString(0x40000000 >>> 1));
System.out.println("--------------------------------");
// 对于负数,带符号右移和不带符号右移的值不同
System.out.println("负数带符号右移和不带符号右移验证:");
System.out.println("要移位的初始值:" + 0x80000000);
System.out.println("负数带符号右移:" + Integer.toHexString(0x80000000 >> 1));
System.out.println("负数不带符号右移:" + Integer.toHexString(0x80000000 >>> 1));
}
}
运行输出: