异或运算的使用

异或运算可以方便记成无进位相加

异或运算的性质:

(1)0^N=N,N^N=0;

(2)异或运算满足交换律和结合律。

异或的运用:

(1)交换两个数

//设有变量a,b,交换a,b两数
a=a^b;
b=a^b;
a=a^b;

异或常见题目:

(1)一个数组中有一个数出现了奇数次,其它数都出现了偶数次,怎么找到并打印出这个数?

//设有满足题意的int型数组arr
int eor=0;
for(i=0;i<arr.length;i++)
{
	eor^=arr[i];
}

(2)怎么把一个int类型的数,提取其最右侧的1出来?

//设有一个int型的数N
//N取反,通过加1就能找到原N右边的第一个1,再与上原N即可
int ANS=N&(~N+1);  

(3)一个数组中有两种数出现了奇数次,其它数都出现了偶数次,怎么找到并打印这两种数?

//设有满足题意的int型数组arr
int eor=0;
for(int i=0;i<arr.length;i++)
{
	eor^=arr[i]; //找到两个目标数a,b的与运算后的结果,存放于eor中
                 //eor必然不为0,即二进制下必有某位i为1
                 //也即目标数a,b中必有a的i为1,b的i为0或反之即反
}
//提取出最右边的1,就以该位为目标位了
int rightOne=eor&(~eor+1);
//eor'
int onlyOne=0;  //用onlyOne来保存目标位为1的那个目标数
//通过判断所有数的目标位是否为1,来将所有数分成两组,a与b必不再同一组
for(int i=0;i<arr.length;i++)
{
	if(arr[i]&rightOne!=0)  //或者arr[i]&rightOne==0
    {
    	onlyOne^=arr[i];
    }
}
cout<<onlyOne<<" "<<onlyOne^eor<<endl;

(4)求一个int型数N中1的个数

//设有int型数N
int count=0;
while(N)
{
	int rightOne=N&(~N+1);  //找到右1
    count++;
    N^=rightOne;  //N异或右1,即减去右1
}

全部评论

相关推荐

01-23 14:54
同济大学 Java
热爱敲代码的程序媛:给你提几点【专业技能】这个模块里面可优化的地方:1.【具备JVM调优经验】可以去b站上搜一下JVM调优的视频,估计一两个小时凭你的学习能力就能掌握JVM调优的实践方面的技能。2.【MySql优化】MySql这一栏,你去b站或者找个博客看看MySql优化,学一下,如果你本身比较熟悉MySql语句的话,那基本半天时间凭你的学习能力MySql语句优化方面的技能你也能掌握个差不多。以上1,2两点主要是因为我看你专业技能大部分都说的是偏理论,没有写应用。再就是最后,你结合你的项目,想一想你的项目中哪些sql语句是可以用MySql优化的,到时候你面试的时候也好结合着说一下。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务