移位操作符操作的运算对象也是 二进制的 "位", 只可用来处理整数类型.
左移位操作符 << 能按照 操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0).
"有符号" 右移位操作符 >> 则按照操作符右侧指定的位数将操作符左边的操作数向右移动。 "有符号" 右移位操作符使用 "符号扩展", 若符号为正,则在高位插入0 , 若符号为负,
则在高位插入1, Java 中增加了一种 "无符号" 右移位操作符 >>>, 它使用 “零扩展”, 无论正负,都在高位插入0。 这一操作符是C++/C 没有的.
如果对char, byte 或者short 类型的数值 进行移位处理, 在移位之前,它们会被转换为int 类型, 得到的结果也是int 类型的值, 只用数值的低 5位 才有用. 因为2的5次方为32, int 类型值只有 32位.若对long 类型的数值进行处理,最后得到的结果也是 long.此时只会用到数值右端的低 6位, 以防止移位超过 long 型数值具有的位数.
"移位" 可与 "等号" (<<= 或 >>= 或>>>=)组合使用.此时,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋给左边的变量。 但在进行 “无符号” 右移位结合赋值操作时,可能会遇到一个问题:
如果对 byte或 short 值进行这样的移位运算, 得到的可能不是正确的结果. 它们会先被转换成 int 类型. 再进行右移操作.然后被截断,赋给原来的类型. 在这种情况下可能得到 -1 的结果。
public class URShift {
public static void main(String[] args) {
int i = -1;
print(Integer.toBinaryString(i));
i >>>=10;
print(Integer.toBinaryString(i));
long l = -1;
print(Long.toBinaryString(l));
l >>>=10;
print(Long.toBinaryString(l));
short s = -1;
print(Integer.toBinaryString(s));
s >>>=10;
print(Integer.toBinaryString(s));
byte b = -1;
print(Integer.toBinaryString(b));
b >>>=10;
print(Integer.toBinaryString(b));
b = -1;
print(Integer.toBinaryString(b));
print(Integer.toBinaryString(b>>>10));
}
private static void print (Object obj){
System.out.println(obj);
}
}