>):将操作符左侧的操作数向右移动操作符右侧指定的位数。移动的规则是,如果被操作数的符号为正,则在二进制的高位补0;如果被操作数的符号为负,则在二进制的高位补1。
3.无符号右移位(>>>):将操作符左侧的操作数向右移动操作符右侧指定的位数。移动的规则是,无论被操作数的符号是正是负,都在二进制位的高位补0。
注意,移位运算符不存在“无符号左移位(<<>)运算和无符号右移位(>>>)运算,当要移位的位数大于被操作数对应数据类型所能表示的最大位数时,那么先将要求移位数对该类型所能表示的最大位数求余后,再将被操作数移位所得余数对应的数值,效果不变。。比如100>>35=100>>(35%32)=100>>3=12。
下面的测试代码验证了以上的规律:
public abstract class Test {
public static void main(String[] args) {
System.out.println(“1 << 3 = " + (1 << 3));
System.out.println("(byte) 1 << 35 = " + ((byte) 1 << (32 + 3)));
System.out.println("(short) 1 << 35 = " + ((short) 1 << (32 + 3)));
System.out.println("(char) 1 << 35 = " + ((char) 1 << (32 + 3)));
System.out.println("1 << 35 = " + (1 << (32 + 3)));
System.out.println("1L << 67 = " + (1L << (64 + 3)));
// 此处需要Java5.0及以上版本支持
System.out.println("new Integer(1) << 3 = " + (new Integer(1) << 3));
System.out.println("10000 >> 3 = ” + (10000 >> 3));
System.out.println(“10000 >> 35 = ” + (10000 >> (32 + 3)));
System.out.println(“10000L >>> 67 = ” + (10000L >>> (64 + 3)));
}
}
运行结果:
1.1 << 3 = 8
2.(byte) 1 << 35 = 8
3.(short) 1 << 35 = 8
4.(char) 1 << 35 = 8
5.1 << 35 = 8
6.1L << 67 = 8
7.new Integer(1) << 3 = 8
8.10000 >> 3 = 1250
9.10000 >> 35 = 1250
10.10000L >>> 67 = 1250
来源:http://blog.csdn.net/chattie/article/details/4029922