java中,移位操作符操作的运算对象是二进制的“位”(bit)。
移位操作符只能处理整数类型(int,char, byte, short, long)。
移位操作符有三种:
(1)左移位操作符 “>>”:按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0)。
(2)(有符号)右移位操作符“<<”:按照操作符右侧指定的位数将操作符左侧的操作数向右移动。符号为正,高位补0;符号为负,高位补1。
(3)无符号右移位操作符“<<<”;按照操作符右侧指定的位数将操作符左侧的操作数向右移动,高位补0。
“移位”可与“等号”(<<=或>>=或>>>=)组合使用。此时,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋给左边的变量。但在进行“无符号”右移位结合赋值操作时,可能会遇到一个问题:如果对byte或short值进行这样的移位运算,得到的可能不是正确的结果。它们会先被转换成int类型,再进行右移操作,然后被截断,赋值给原来的类型,在这种情况下可能得到一1的结果。
下面是一个demo
public class ShiftOp{
public static void main(String[] args){
printL(2,1);
printL(4,2);
printL(-2,1);
printL(-4,2);
printR(2,1);
printR(2,2);
printR(-2,1);
printR(-2,3);
printUR(2,1);
printUR(-2,1);
printUR(16,2);
printUR(0,1);
//保留位数
short s = (short)10000;
printSR(s,1);
printL(s,4);
}
private static void printSR(short s ,int b){
System.out.println("s:" + s + " >> " + b + " = " + (s >> b) + "-bin=" + Integer.toBinaryString(s >>= b));
}private static void printR(int s ,int b){
System.out.println(s + " >> " + b + " = " + (s >> b) + "-bin=" + Integer.toBinaryString(s >>= b));
}
private static void printL(short s ,int b){
System.out.println("s:" + s + " << " + b + " = " + (s << b) + "-bin=" + Integer.toBinaryString(s <<= b) );
}private static void printL(int s ,int b){
System.out.println(s + " << " + b + " = " + (s << b) + "-bin=" + Integer.toBinaryString(s <<= b) );
}
private static void printUR(int s ,int b){
System.out.println(s + " >>> " + b + " = " + (s >>> b) + "-bin=" + Integer.toBinaryString(s >>>= b) );
}
}
参考资料
《java编程思想》