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:11111111111111111111111111101011
num=21,num1=-21,>>,>>>计算后:
num>>2:5二进制表示:101
num>>>2:5,二进制表示:101
num1>>2:-6二进制表示:11111111111111111111111111111010
num1>>>2:1073741818,二进制表示:111111111111111111111111111010
num1无符号右移31位的值:1二进制表示:1
num1无符号右移33位的值:2147483637二进制表示:1111111111111111111111111110101
0无符号右移:0
i0>>>2(与num1>>>2比较):1073741818
计算前的i:1111111111111111111111111111111111111111111111111111111111101011
4611686018427387898二进制表示:11111111111111111111111111111111111111111111111111111111111010

注意上述结果的二进制表示中有些省略掉了前导0.