Java位运算

总结

  • java int 32位 4字节
  • 正数换算成二进制后的高位补0,负数的二进制高位补1
  • 右移相当于除以2取整
  • 左移相当于乘以2
  • 负数的二进制表示为其正数的二进制的补码
  • 补码=反码+1
  • 负数无符号右移,高位也是补0,负数变成正数
  • 按位异或 相同为0,不同为1

相关验证

public class BitOperator {

    public static void main(String[] args) {
        //java int 32位 4字节
        //正数换算成二进制后的高位补0,负数的二进制高位补1
        //   0000 0000 0000 0000 0000 0000 0000 0001
        //=> 0000 0000 0000 0000 0000 0000 0000 0000
        // 正数右移高位补0
        //output:0
        System.out.println(1 >> 1);


        //   0000 0000 0000 0000 0000 0000 0000 0001
        //=> 0000 0000 0000 0000 0000 0000 0000 0010
        //左移相当于乘以2
        // 正数左移低位补0
        //output:2
        System.out.println(1 << 1);


        //   0000 0000 0000 0000 0000 0000 0000 0100
        //=> 0000 0000 0000 0000 0000 0000 0000 0010
        //右移相当于除以2
        //output:2
        System.out.println(4 >> 1);


        // 无符号右移 高位补0
        //   0000 0000 0000 0000 0000 0000 0000 0001
        //=> 0000 0000 0000 0000 0000 0000 0000 0000
        //output:0
        System.out.println(1>>>1);


        //负数的二进制表示为其正数的二进制的补码
        //补码=反码+1
        //所以-1的二进制表示为
        //0000 0000 0000 0000 0000 0000 0000 0001 (1的原码) => 1111 1111 1111 1111 1111 1111 1111 1110(1的反码)+1 => 1111 1111 1111 1111 1111 1111 1111 1111
        //负数的二进制高位为1
        //   1111 1111 1111 1111 1111 1111 1111 1111
        //=> 1111 1111 1111 1111 1111 1111 1111 1111
        //output:-1
        System.out.println(-1 >> 1);


        //   1111 1111 1111 1111 1111 1111 1111 1111
        //=> 1111 1111 1111 1111 1111 1111 1111 1111
        //output:-1
        System.out.println(-1 >> 2);


        //-5的二进制表示
        //0000 0000 0000 0000 0000 0000 0000 0101 (5的原码) => 1111 1111 1111 1111 1111 1111 1111 1010(5的反码)+1 => 1111 1111 1111 1111 1111 1111 1111 1011
        //   1111 1111 1111 1111 1111 1111 1111 1011
        //=> 1111 1111 1111 1111 1111 1111 1111 1101
        //output:-3
        System.out.println(-5 >> 1);


        //负数无符号右移,高位也是补0,负数变成正数
        //   1111 1111 1111 1111 1111 1111 1111 1111
        //=> 0111 1111 1111 1111 1111 1111 1111 1111
        //output:2147483647
        System.out.println(-1>>>1);


        //& 按位与
        //   0000 0000 0000 0000 0000 0000 0000 0001 & 0000 0000 0000 0000 0000 0000 0000 0011
        //=> 0000 0000 0000 0000 0000 0000 0000 0001
        //output:1
        System.out.println(1&3);


        //| 按位或
        //   0000 0000 0000 0000 0000 0000 0000 0001 | 0000 0000 0000 0000 0000 0000 0000 0011
        //=> 0000 0000 0000 0000 0000 0000 0000 0011
        //output:3
        System.out.println(1|3);


        //^ 按位异或 相同为0,不同为1
        //   0000 0000 0000 0000 0000 0000 0000 0001 ^ 0000 0000 0000 0000 0000 0000 0000 0011
        //=> 0000 0000 0000 0000 0000 0000 0000 0010
        //output:2
        System.out.println(1^3);

        //~ 按位取非
        //  ~0000 0000 0000 0000 0000 0000 0000 0001
        //   1111 1111 1111 1111 1111 1111 1111 1110
        //output:-2
        System.out.println(~1);


    }
}

//output
0
2
2
0
-1
-1
-3
2147483647
1
3
2
-2

# java 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×