异或运算满足交换率、结合律。
性质:
- a^0 = a
- a^a = 0
应用:
-
不需额外变量交换两个数的值(前提是a和b不能在同一个内存单元中)
a = a^b
b = a^b
a = a^b -
提取出int类型最右边的1
a & (~a + 1) -
一个数组中有两个数出现了奇数次,其他数都出现了偶数次,求出现奇数次的这两个数?
用一个变量eor将数组中所有的数异或一遍,假设a,b出现了奇数次,且a不等于b,则eor= a^b ,且不为0,所以eor中必有一个位为1。因此可以将eor最右边为1的那一位是否为1可以将整个数组分为两类,一类是该位为1,另一类是该位为0,而a和b必属于两类。因此可以再用一个变量,将该位为1的数异或一遍,就的得到了一个数出现了奇数的数。
int a[6] = { 1,2,2,3,4,4 };//1和3出现了奇数次
int eor = 0;
int eor1 = 0;
int re1;
int re2;
for (int i = 0; i < 6; ++i) {
eor = eor ^ a[i];
}
int rightestOne = eor & (~eor + 1);
for (int i = 0; i < 6; ++i) {
if ((a[i] & rightestOne) == 0) {//该位为0的数
eor1 = eor1 ^ a[i];
}
}
re1 = eor1;
re2 = eor ^ re1;
cout << re1 << "," << re2 << endl;
标签:该位,eor1,int,re1,eor,异或 来源: https://www.cnblogs.com/dylan-blog/p/16478034.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。