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的二进制。

  • 相关阅读:
    对象池使用时要注意几点
    Flash3D学习计划(一)——3D渲染的一般管线流程
    714. Best Time to Buy and Sell Stock with Transaction Fee
    712. Minimum ASCII Delete Sum for Two Strings
    647. Palindromic Substrings(马拉车算法)
    413. Arithmetic Slices
    877. Stone Game
    338. Counting Bits
    303. Range Sum Query
    198. House Robber
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13075498.html
Copyright © 2011-2022 走看看