java中有‘>>>’运算符,表示无符号右移运算。简单来说:j>>>i表示将数向右位移i位,右移后左边空出的位用0补上,具体细节如下:
1、操作数类型:byte、short、int、long
2、>>>在右移的时候在二进制表示的左端添0,运算结果取决于其二进制表示。相同的byte、short、int类型运算数得到的结果相同,long类型的运算数与前者可能不同。
3、对于j>>>i的结果是j>>>(i%(j的二进制表示的位数))的结果,如int j=-21,i=33 的结果是-21>>1的结果(当i的值大于等于j的二进制表示的位数时要注意)。
4、0的无符号右移值仍然为0
>>>与>>的比较:
1、注意有>>>运算但是没有<<<运算。
2、对正数而言>>>与>>作用相同。
3、对于负数而言>>在右移的时候根据原数的正负决定在左端高位添加0或1(原数操作后正负不变);
而>>>在右移的时候在左端添0,则不论原来的数是正或负,右移后为非负数.
测试代码如下:
public class Test1 { public static void main(String[] args) { int num = 21, num1 = -21; System.out.println("二进制表示:"); System.out.println("num:" + Integer.toBinaryString(num) + ",num1:" + Integer.toBinaryString(num1)); System.out.println("num=21,num1=-21,>>,>>>计算后:"); System.out.println("num>>2:" + (num >> 2) + "二进制表示:" + Integer.toBinaryString((num >> 2))); System.out.println("num>>>2:" + (num >>> 2) + ",二进制表示:" + Integer.toBinaryString(num >>> 2)); System.out.println("num1>>2:" + (num1 >> 2) + "二进制表示:" + Integer.toBinaryString((num1 >> 2))); System.out.println("num1>>>2:" + (num1 >>> 2) + ",二进制表示:" + Integer.toBinaryString(num1 >>> 2)); System.out.println("num1无符号右移31位的值:" + (num1 >>> 31) + "二进制表示:" + Integer.toBinaryString(num1 >>> 31)); System.out.println("num1无符号右移33位的值:" + (num1 >>> 33) + "二进制表示:" + Integer.toBinaryString(num1 >>> 33)); // 0运算后为0 System.out.println("0无符号右移:" + (0 >>> 2)); //不同数据类型间的比较 short i0 = -21, j0 = 2; System.out.println("i0>>>2(与num1>>>2比较):"+(i0 >>> j0));// 结果与上述num1>>>2相同 // byte、shot、int、long,由于byte、short间运算时会自动转换为int,所以初始值相同时计算结果相同,但long类型运算的结果则可能不相同(8个字节) long i = -21, j = 2; System.out.println("计算前的i:" + Long.toBinaryString(i)); System.out.println((i >>> j) + "二进制表示:" + Long.toBinaryString(i >>> j)); }}
运行结果如下:
二进制表示:num:10101,num1:11111111111111111111111111101011num=21,num1=-21,>>,>>>计算后:num>>2:5二进制表示:101num>>>2:5,二进制表示:101num1>>2:-6二进制表示:11111111111111111111111111111010num1>>>2:1073741818,二进制表示:111111111111111111111111111010num1无符号右移31位的值:1二进制表示:1num1无符号右移33位的值:2147483637二进制表示:11111111111111111111111111101010无符号右移:0i0>>>2(与num1>>>2比较):1073741818计算前的i:11111111111111111111111111111111111111111111111111111111111010114611686018427387898二进制表示:11111111111111111111111111111111111111111111111111111111111010
注意上述结果的二进制表示中有些省略掉了前导0.