zoukankan      html  css  js  c++  java
  • 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的二进制。

  • 相关阅读:
    事件的基本概念
    c# 语法 字符串内插
    tcp 的编程例子
    Action 语法的简介
    wcf 的小介绍
    Socket编程
    c# base new 等关键字基础
    虚函数和继承的关系
    arraylist,list ,数组区别
    Python爬虫-selenium模拟豆瓣电影鼠标下拉
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12946770.html
Copyright © 2011-2022 走看看