位运算的一些练习
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; } };
布隆过滤器:(可以精确地代表一个集合,精确地判断某一元素是否在此集合中,精确程度由用户自己设计)
应用场景:
- 网页黑名单系统
- 垃圾邮件过滤系统
- 爬虫的网址判断重复系统
- 容忍一定程度的失误率
- 堆空间要求较严格