• Java中那些烦人的位运算(&,|...)


    & 和 && 相同点:

    都表示“与”操作。这里的“与”和数学中的“与或非”中的“与”意义相同,都遵循“一假必假”原则。即“与”符号两边的元素只要有一个为假,"与"操作执行后的结果就为假。

    & 和 && 的区别:

    1)
    & 表示“按位与",这里的”位“是指二进制位(bit)。
    例:十进制数字8 转化为二进制是:1000 ;数字9 转化为二进制是1001 。
    则如有以下程序:

    public class Test {
    public static void main(String[] args) {
    System.out.println(9 & 8);
    	}
    }
    

    输出结果应该是:8
    原因:1001 & 1000 = 1000 。 计算机中一般1表示真,0表示假。最左边一位1&1=1,最右边一位1&0 = 0.

    1. && 表示逻辑”与“ ,即java中的boolean值才可以存在于&&符号的左右两侧。
      true && false = false ,true && true = true , 依旧是"一假必假"。
      值的注意的是:&& 符号有所谓的“短路原则”,当 A && B 出现时,如果A经判断是假,那么B表达式将不会获得执行或被判断的机会。直接结果就为假。
      注:关于十进制与二进制的转换,简单的说每四位可以遵循”8421“原则,1001即8+1=9,1011即8+2+1=11

    Java中的>> << >>>

    <<  表示左移,不分正负数,低位补0
    >>  表示右移,如果该数为正,则高位补0,若为负数,则高位补1
    >>> 表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
    
    System.out.println("16 << 1 : " + (16 << 1));
    System.out.println("16 >> 3 : " + (16 >> 3));
    System.out.println("16 >> 10 : " + (16 >> 10));
    System.out.println("1 >> 1 : " + (1 >> 1));
    System.out.println("16 >>> 2 : " + (16 >>> 2));
    System.out.println("-16 >> 2 : " + (-16 >> 2));
    System.out.println("-16 << 2 : " + (-16 << 2));
    System.out.println("-16 >>> 2 : " + (-16 >>> 2));
    

    打印结果

    16 << 1 : 32
    16 >> 3 : 2
    16 >> 10 : 0
    1 >> 1 : 0
    16 >>> 2 : 4
    -16 >> 2 : -4
    -16 << 2 : -64
    -16 >>> 2 : 1073741820
    

    简单理解:

    << 1  相当于乘以2
    
    >> 1  相当于除以2
    
    >>> 不考虑高位的正负号,正数的 >>> 等同于 >>
     
    

    |=

    关于 |= 运算符:|= 运算符和 += 这一类的运算符一样,拆解开就是 a = a | b;

    代码如下:

    public static strictfp void main(String[] args) {
    
       int a = 5; // 0000 0101
       int b = 3; // 0000 0011
       a |= b; // 0000 00111
       System.out.println(a);
    
    }
     
    

    具体规则为:两个二进制对应位为0时该位为0,否则为1。拿5的二进制 0000 0101 和 3的二进制 0000 0011 进行|运算,后三位的的对应位都不是同时等于0,所以最终结果为 0000 0111 也就是7的二进制。

    &=

    &= 和 |= 基本是一样的,只不过对于比较同位方式不同。

    代码如下:

     
    public static strictfp void main(String[] args) {
    
        int a = 5; // 0000 0101
        int b = 3; // 0000 0011
        a &= b; // 0000 0001
        System.out.println(a);
    }
     
     
    

    具体规则为:两个二进制对应位都为1时,结果为1,否则结果为都0。拿5的二进制 0000 0101 和 3的二进制 0000 0011 进行&运算,只有最后一位都为1,则最终结果为 0000 0001 也就是1的二进制。

    ^=

    运算规则还是同上。

    代码如下:

    public static strictfp void main(String[] args) {
        int a = 5; // 0000 0101
        int b = 3; // 0000 0011
        a ^= b; // 0000 0110
        System.out.println(a);
    }
    

    具体规则为:两个二进制对应位相同时,结果为0,否则结果为1。拿5的二进制 0000 0101 和 3的二进制 0000 0011 进行^运算,1-5位对应位都是0所以1-5位都为0,第8位都为1所以第8位也为0,其他的对应位都不相等所以为1,则最终结果为 0000 0110 也就是6的二进制。

  • 相关阅读:
    修改host批量处理.bat
    当前标识(IIS APPPOOL如来官网)没有对“C:WindowsMicrosoft.NETFramework64v4.0.30319Temporary ASP.NET Files”的写访问权限。
    SQL Server 2005基础应用视频教程下载学习
    .netcore获取已注入的服务
    触发器设置递归
    Attention Is All You Need
    FreeSwitch LUA API —— Sessions
    扇贝背单词,增加单词快捷文本复制按钮 需要安装tampermonkey
    java G711 流式编码和解码方法
    Webrtc 介绍与Demo环境搭建
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13075498.html
Copyright © 2020-2023  润新知