java中有三种移位运算符
*<< : 左移运算符,num << 1,相当于num乘以2
*>> : 右移运算符,num >> 1,相当于num除以2
*>>> : 无符号右移,忽略符号位,空位都以0补齐
java中的移位操作只对int和long有效,byte、short、char升级为int后再进行移位

  • 移位操作符有>>(右移)、<<(左移)、>>>(右移)三种,注意两点:1.没有<<<符号 2.移位是不循环的
    正数在计算机二进制中以原码方式储存,负数以反码和补码方式储存。反码即把原码0换为1,1换为0,然后低位补1
    例如:
    3的二进制表示为00000000000000000000000000000011
    -3的二进制表示为11111111111111111111111111111101

  • 三种的区别是

  • 是带符号右移,负数高位补1,正数补0

  • <<左移不管负数还是正数,在低位永远补0

  • 是不带符号右移,不论负数还是正数,高位补0
    下面来看看这些移位运算都是怎样使用的:

public class Shift {
    public static void main(String[] args) {
        System.out.println("******************正数左移在低位补0*******************");
        int a = 1;
        a = a << 2;
        System.out.println(a);
        System.out.println(Integer.toBinaryString(a));
        System.out.println("******************正数右移在高位补0********************");
        a = 1;
        a = a >> 2;
        System.out.println(a);
        System.out.println(Integer.toBinaryString(a));
        System.out.println("******从上面结果可以看出:移位是不循环的*****");
        System.out.println("看看负数的移位:");

        System.out.println("***********负数的右移操作高位补1**************");
        int i = -1;
        System.out.println(i + ":");
        System.out.println(Integer.toBinaryString(i));
        i = i >> 2;
        System.out.println(i);
        System.out.println(Integer.toBinaryString(i));
        System.out.println("**********负数的左移操作低位补0*****************");
        i = i << 2;
        System.out.println(i);
        System.out.println(Integer.toBinaryString(i));
        System.out.println("*************再看看>>>操作符*************");
        System.out.println("*************负数的>>>操作高位补0***************");
        i = -1;
        System.out.println(Integer.toBinaryString(i));
        i = i >>> 10;
        System.out.println(i + ":");
        System.out.println(Integer.toBinaryString(i));
        System.out.println("*************注意:没有<<<符号**************");

        System.out.println("**********byte类型移位时要强转换*************");
        byte k = 10;
        System.out.println(Integer.toBinaryString(k));
        k = (byte) ((byte) k >>> 2);
        System.out.println(Integer.toBinaryString(k));
    }
}

运行结果如下:

********正数左移在低位补0*******************
4
100
********正数右移在高位补0********************
0
0
*从上面结果可以看出:移位是不循环的
看看负数的移位:
*负数的右移操作高位补1**************
-1:
11111111111111111111111111111111
-1
11111111111111111111111111111111
**负数的左移操作低位补0***************
-4
11111111111111111111111111111100
***再看看>>>操作符***
***负数的>>>操作高位补0***************
11111111111111111111111111111111
4194303:
1111111111111111111111
***注意:没有<<<符号****
*****byte类型移位时要强转换********
1010
10