Java移位操作>>,>>>与

带符号数右移>>,如果是正数,则在最高位补0,负数则补1
无符号右移>>>,在最高位补0

需要特别注意的是,在对char、byte、short等类型的数进行移位操作前,编译器都会自动地将数值转化为int型,然后进行移位操作。由于int型变量只占用4Byte(32bit),因此当右移的位数超过32bit时,移位运算没有任何意义。所以为了保证有效性,采用了取余操作,即a>>n等价于a>>(n%32)

    public static void main(String[] args) {
        int a = -1;
        System.out.println(a>>1);
        System.out.println(a>>>1);
    }

结果:

-1
2147483647

解释:

1111 1111 1111 1111 1111 1111 1111 1111 -1

1111 1111 1111 1111 1111 1111 1111 1111 -1

0111 1111 1111 1111 1111 1111 1111 1111 2147483647

左移操作<<,最低位用零补位,左移操作实际上相当于每移动一位乘2

    public static void main(String[] args) {
        int a = 3;
        System.out.println(a);
        System.out.println(a<<1);

    }

结果:

3
6

注意:java中没有无符号左移,因为左移是在后面补0,而右移是在前面补0或者1,有无符号数取决于数的前面的第一位是0还是1,所以右移会产生到底补0还是1的问题,而左移始终是在右边补,不会产生符号问题,所以没有必要有无符号左移<<<,因为与<<的意义是一样的。

你可能感兴趣的:(Java)