与&和或|和异或^的巧妙应用

2020-09-16  本文已影响0人  chanyi

&:与,要求都是1才为1,其他都为0
|:或,要求有一个为1即可1,全是0为0
^:异或,要求相同为0,不同为1

1、&的使用

1、计算一个数n转为二进制后,1的个数
可以循环进行n&(n-1),直到n=0

            int count=0;
            while (n!=0){
                count++;
                n=n&(n-1);
            }

2、判断一个数n的奇偶性
计算n&1,等于0是偶数,1是奇数

System.out.println("5&1="+(5&1));

3、利用每一位表示不同含义
比如在实际的业务场景中有多种情况,并且多种情况可以组合的,则可以将每一种种情况用整数的每一位表示。例如用户的权限有A、B、C三种。并且三种权限可以组合,如用户zhangsan可以有AC权限,lisi可以有ABC权限。这样的情况下,只需要用整数7即可完全表示所有可能的组合,第一位表示A,第二位表示B,第三位表示C,则A对应的是1,B对应的是2,C对应的是4,ABC则对应的是7。
这样的方式可以节省存储空间,计算也高效。
判断时候拥有某权限,只需要&对应的数字,比如6&4=4,则可以得知6拥有C权限。

2、|的使用

|运算表示如果有一个位为1,则为1.
1、如果有负数参与判断,则可以使用|简化
例如:

if(x<1||y<1){
      System.out.println("有负数");
    }

可以简化改写为:

if( (x|y) <0){
      System.out.println("有负数");
    }

3、^的使用

1、快速判断两个整数是否相等
主要思想是,两个整数相同,则二进制相同,做异或运算得结果为0
优点是快!因为是位运算。
具体代码

System.out.println(4^4);//输出0

2、两个数交换
主要思想是a^b^a =b,a^b^b=a
这样的方式优点是,不需要借助临时变量
具体代码

    int a = 9;
    int b = 7;
    a=a^b;
    b=a^b;
    a=a^b;
    System.out.println(a+"-"+b);//7-9

3、寻找数组中只出现一次的数,其他数出现两次
代码:

public int singleNumber(int[] nums) {
        int num = nums[0];
        for (int i=1 ;i<nums.length;i++){
            num  = num^nums[i];
        }
        return num;
    }

4、将某个整数的指定位反转
利用01=1,11=0的规律,将指定位对应异或1即可。例如将9(1001)的第二位反转。则只需要将(1001^0010)即可;
具体代码

System.out.println(9^2);//输出11,即(1011)
上一篇下一篇

猜你喜欢

热点阅读