位运算的一些练习

class Compare {
public:
    int Flip(int c)
    {return c^1;//按位异或
    }
    int GetSign(int c)//非负为1,负为0.
    {
        return Flip((c>>31)&1);//右移 左侧补符
    }
    int getMax(int a, int b)
    {
        int c=a-b;//a-b>=0 返回a 否则返回b,这种方法可能会溢出
        int as=GetSign(a);
        int bs=GetSign(b);
        int cs=GetSign(c);
        int sam=Flip(as^bs);//1.判断a b是否同号
        if(sam)
            return cs?a:b;//a b异号
        else
            return (as-bs)?a:b;
    }
};

using namespace std;
class Swap {
public:
    vector<int> getSwap(vector<int> num) 
    {
        num[0]=num[0]^num[1];
        num[1]=num[0]^num[1];
        num[0]=num[0]^num[1];
        return num;
    }
};

class OddAppearance {
public:
    vector<int> findOdds(vector<int> arr, int n)
    {
        vector<int> res;
        int check1=0;//经过一次遍历异或之后,得到的是两个只出现一次的数字的异或和
        for(int i=0;i<n;i++)
            check1=check1^arr[i];

        int k=0,temp=check1;//从左到右第一个为1的bit位
        while(!(temp&1))
        {
            k++;
            temp>>=1;
        }

        //根据bit位是否为1把数组分为两个部分
        int help=pow(2.0,k),check2=0;
        for(int i=0;i<n;i++)
            if(arr[i]&help)
                check2=check2^arr[i];
        check1=check1^check2;
        res.push_back(check1<check2?check1:check2);
        res.push_back(check1>check2?check1:check2);
        return res;
    }
};

class OddAppearance {
public:
    int findOdd(vector<int> A, int n) 
    {
        int temp=0;
        for(int i=0;i<n;i++)
            temp=temp^A[i];
        return temp;
    }
};

布隆过滤器:(可以精确地代表一个集合,精确地判断某一元素是否在此集合中,精确程度由用户自己设计)

  应用场景:

  1. 网页黑名单系统
  2. 垃圾邮件过滤系统
  3. 爬虫的网址判断重复系统
  4. 容忍一定程度的失误率
  5. 堆空间要求较严格

 

 

posted on 2019-07-31 22:35  tianzeng  阅读(436)  评论(0编辑  收藏  举报

导航