美文网首页
与&和或|和异或^的巧妙应用

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

作者: chanyi | 来源:发表于2020-09-16 14:12 被阅读0次

    &:与,要求都是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)
    

    相关文章

      网友评论

          本文标题:与&和或|和异或^的巧妙应用

          本文链接:https://www.haomeiwen.com/subject/clcpdktx.html