运算符>>指的是对它左边的操作数带符号右移位。我们知道数据的补码表示,如果是负数,那么它的最高位是1,所以右移位操作时左边的空缺用1填补。
运算符>>>也是右移,但它与>>的区别是对于负数,右移不是用1填补,而是用0填补。也就是>>>不考虑数的正负,机械地移位就是了。
另外:>>>的左边操作数如果是char,byte,short,运算前会先转换成int,运算结果也就成了int,如果再对运算后的结果int强制类型转换到byte,那它只会机械地截取数据的最右边8位。
程序一
byte i = (byte)0xf3;//二进制:11110011
byte j = (byte)(i >>> 3);
System.out.printf("%x", j);
程序二
byte i = (byte)0xf3;//二进制:11110011
byte j = (byte)((i & 0xff) >>> 3);
System.out.printf("%x", j);
程序1的运行结果是:fe,也就是二进制:11111110( 0xf3转换为整型后会变成fffffff3,二进制为11111111111111111111111111110011,移位3位后变成00011111111111111111111111111110,转换为byte,结果自然为11111110 ),而不是预期的结果:1e,也就是二进制:00011110。
程序2中将操作数移位前与0xff作一次按位与运算后得到预期的结果(这里0xff是整型,完整的写法是0x000000ff,因此0xf3 & 0xff的结果为000000f3,该值右移三位再转换为byte的值为1e)。