Java位运算

来源:互联网 发布:生产流程管理优化论文 编辑:程序博客网 时间:2024/05/24 05:19

1、左移( << )

        System.out.println(5 << 2);        // 5的二进制101,左移两位,10100,即20(10进制)。运行结果是20

2、右移( >> )

        System.out.println(5 >> 2);// 运行结果是1

3、无符号右移( >>> ) 高位补0

// 例如 -5换算成二进制后为:0101 取反加1为1011        // 1111 1111 1111 1111 1111 1111 1111 1011        // 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:        System.out.println(5 >> 3);// 结果是0        System.out.println(-5 >> 3);// 结果是-1        System.out.println(-5 >>> 3);// 结果是536870911

如何用二进制表达一个负数?

在计算机中,负数以其正值的补码形式表达。
原码:一个整数按照绝对值大小转换成的二进制数。
如5的原码00000000 00000000 00000000 00000101(int类型占4字节,32位,所以前面填了一些0补全32位)

反码:将二进制数按位取反,所得的新的二进制。(取反:1改为0,0改为1)
如5的反码11111111 11111111 11111111 11111010
那么,5的补码为:
11111111 11111111 11111111 11111010 + 1=
11111111 11111111 11111111 11111011,即-5
所以-5的二进制在计算机中为11111111 11111111 11111111 11111011
转为十六进制:0xFFFFFFFB(0x代表16进制)
综上,可知1的补码即-1,其二进制在计算机中全为1。
所以-5 >> 3的结果为-1( >>对于负整数 高位补1;对于正整数,高位补0)
-5 >>> 3的 结果是000 11111111 11111111 11111111 11111
即536870911(无符号 高位补0)

4、位与( & )
第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n位也为1,否则为0

        System.out.println(5 & 3);// 结果为1        System.out.println(4 & 1);// 结果为0

5、位或( | )
第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0

    System.out.println(5 | 3);// 结果为7

6、位异或( ^ )
第一个操作数的的第n位 与 第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0

 System.out.println(5 ^ 3);//结果为6 

7、位非( ~ )
操作数的第n位为1,那么结果的第n位为0,反之。

        System.out.println(~-5);        // 结果为-4。5的补码为        11111111 11111111 11111111 11111011(-5),        //取反得        00000000 00000000 00000000 00000100

得出的口诀就是(不知道对不对,也没验证):数值(正数、负数)加1取反;如-5按位非:-5 + 1为-4,取反为4;6按位非:6+1为7,取反为-7;

0 0
原创粉丝点击