Java位运算

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;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值