Java 位运算符 位与,位或,位非,位异或,右移,左移

    今天看代码遇到位运算符,因为不常用已经忘记了,所以复习一下。Java位运算符包括:位与'&',位或'|',位非'~',位异或'^',右移'>>',左移'<<',右移'>>>' 

    位运算是以二进制位为单位进行的运算,其操作数和运算结果都是整型值。运算需要用到一些二进制知识,稍微回顾一下。这里有一篇介绍二进制、原码、反码和补码的文章:https://blog.csdn.net/vickyway/article/details/48788769。比较详细,这里不再赘述了。

   下面代码中有具体计算过程(稍需注意的是,Java中int类型是32bit)

//java中包含运算符 = 位与'&',位或'|',位非'~',位异或'^',右移'>>',左移'<<',右移'>>>'
        //参与位运算的数字都是二进制补码的方式进行按位与、或、异或,正数的反码、补码都是其本身

        //1. '&' 位与运算符(两个操作数都为1,结果才为1,否则结果为0)
        System.out.print("1&-3 = ");
        System.out.println(1&-3);
        /*计算过程(使用补码)
             1:    00000000 00000000 00000000 00000001
            -3:    11111111 11111111 11111111 11111101
            结果:  00000000 00000000 00000000 00000001  (结果也是补码,因为是正数,原码相同) 1
         */

        //2. '|' 位或运算符(两个位只要有一个为1,那么结果就是1,否则就为0)
        System.out.print("1|-3 = ");
        System.out.println(1|-3);
        /*计算过程(使用补码)
             1:    00000000 00000000 00000000 00000001
            -3:    11111111 11111111 11111111 11111101
            结果:  11111111 11111111 11111111 11111101  (结果也是补码,转成原码 10000000 00000000 00000000 00000011) -3
         */

        //3. '~' 位非运算符(如果位为0,结果是1,如果位为1,结果是0)
        System.out.print("~-3 = ");
        System.out.println(~-3);
        /*计算过程(使用补码)
            -3:    11111111 11111111 11111111 11111101
            结果:  00000000 00000000 00000000 00000010  (正数,原码相同) 2
         */

        //4. '^' 位异或运算符(两个操作数,相同则结果为0,不同则结果为1)
        System.out.print("1^-3 = ");
        System.out.println(1^-3);
        /*计算过程(使用补码)
             1:    00000000 00000000 00000000 00000001
            -3:    11111111 11111111 11111111 11111101
            结果:  11111111 11111111 11111111 11111100  (转成原码:10000000 00000000 00000000 0000 0100) -4
         */

        //5. '<<' 左移运算符(左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0))
        System.out.print("-3<<2 = ");
        System.out.println(-3<<2);
        /*计算过程(使用补码)
            -3:    11111111 11111111 11111111 11111101
            结果:  11111111 11111111 11111111 11110100  (转成原码:10000000 00000000 00000000 00001100) -12
         */

        //6. '>>' 右移运算符("有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。如果值为正,则在高位补0,如果值为负,则在高位补1.)
        System.out.print("-3>>2 = ");
        System.out.println(-3>>2);
        /*计算过程(使用补码)
            -3:    11111111 11111111 11111111 11111101
            结果:  11111111 11111111 11111111 11111111  (转成原码:10000000 00000000 00000000 00000001) -1
         */

        //7. '>>>' 右移运算符("无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。无论值的正负,都在高位补0.)
        System.out.print("-3>>>2 = ");
        System.out.println(-3>>>2);
        /*计算过程(使用补码)
            -3:    11111111 11111111 11111111 11111101
            结果:  00111111 11111111 11111111 11111111 2^30次方 - 1 = 1073741823
         */

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值