java · 2022年5月25日 0

java位运算与位移运算

一、& 与运算

将算数转换成二进制,每一个相对应的位相与,都为 1 则为1,其他的为0

public void andCal(){
        int a = 4;  // 0100
        int b = 10; // 1010
        System.out.println(a & b); // 结果:0
    }
0100   4
1010   10
-------
0000   0

二、| 或运算

将算数转换成二进制,每一个相对应的位相或,有 1 则为1,都为0则为0

public void orCal(){
        int a = 4;  // 0100
        int b = 10; // 1010
        System.out.println(a | b); // 结果:14
    }
0100     4
1010     10
----------
1110     14

三、^ 异或

将算数转换成二进制,每一个相对应的位异或,相同则为 0,不同则为1

public void orElse(){
        int a = 4;  // 0100
        int b = 10; // 1010
        System.out.println(a ^ b); // 结果:14
    }
0100     4
1010     10
-----------
1110     14

案列:两个变量值互换

public void tranport(){
        int a = 4;  // 0100
        int b = 10; // 1010
        a = a ^ b; // 1110
        b = a ^ b; // 0100
        a = a ^ b; // 1010
        System.out.println(a);  // 10
        System.out.println(b);  // 4 
    }

四、<< 左移运算

正数左移:整体向左移 n 位,右边空缺部分补 0,左边溢出部分舍弃

public void leftMove(){
        int a = 4; // 00000100
        System.out.println( a << 1 ); // 8
    }
00000100     <<1
----------------
00001000

负数左移:先取反,再加1取补码,再左移,再减1,在取反

public void leftMove(){
        int a = -4; // 10000100
        System.out.println( a << 1 );  // -8
    }
10000100
11111011   取反
11111100   +1取补码
11111000   左移
11110111   -1取反码
10001000   取反

左移规律:将原数 乘 2^n,n代表左移位数

五、>> 右移运算

正数右移:整体向右移 n 位,左边空缺部分补 0,右边溢出部分舍弃

public void leftMove(){
        int a = 4; // 00000100
        System.out.println( a >> 1 ); // 2
    }
00000100  >>1
-------------
00000010

负数右移:先取反,再加1取补码,再右移,再减1,在取反

public void leftMove(){
        int a = -4; // 10000100
        System.out.println( a >> 1 );  // -2
    }
10000100   
11111011   取反
11111100   加一取补码
11111110   右移
11111101   减1取反码
10000010   取反

右移规律:将原数 除2^n,n代表右移位数

六、>>> 无符号右移

正数与右移规则一样

负数先取反码,再加1取补码,再无符号右移

public void leftMove(){
        int a = -4;

        System.out.println( a >>> 1 );
  // 2147483646
    }
10000000 00000000 00000000 00000100
11111111 11111111 11111111 11111011   取反
11111111 11111111 11111111 11111100   加1
01111111 11111111 11111111 11111110   无符号右移