【C++算法——异或】 案例:实现两数交换和max

异或看做无进位的相加即可
1010
1101

0111

基本性质:1满足各种运算律    2 n^n=0    0^n=n

案例1:swap伪代码

//根据我前面的性质2写出来推
a=1,b=2
a=a^b; 
b=a^b;
a=a^b;

案例2:两数max方法1(这个方法会有溢出的风险)

//  signe的num>>31 & 1:取其符号位
//  file的num^1: 1-0   0-1
//为什么?看下面
auto file(int num) { return num ^ 1; }
auto sign(int num) { return file(num >> 31 & 1); }  //非负返回1,负数返回0

int main()
{
	int a, b; cin >> a >> b;    //假设a=3   b=2;
	int c = a - b;           //c>0->a>b;  else……
	auto returnA = sign(c);  //假设c>0 ,经过上面俩函数,returnA变1
	auto returnB = file(returnA);  //returnB变0
	cout << a * returnA + b * returnB;   //然后巧妙的b没了

	return 0;
}

案例2:两数max方法2

auto file(int num) { return num ^ 1; }
auto sign(int num) { return file(num >> 31 & 1); }
	
//强调:非负返回1,负返回0
	int sc = sign(c);   //c的符号
	int sa = sign(a);   //a的符号
	int sb = sign(b);   //b的符号
	
	//两者互斥
	int diffAB = sa ^ sb;       //判断ab符号是否不一样,不一样返回1,一样返回0
	int sameAB = file(diffAB);  //判断ab符号是否一样,一样返回1,不一样返回0

	
	//returnA和returnB互斥
	int returnA = diffAB * sa + sameAB * sc; //根据上述肯定:加号必有一侧失效
	//ab符号不一样,而且sa非负 return a ; ab符号一样而且c(c=a-b)非负  return a	returnA不是0就是1
	int returnB = file(returnA);  

	cout << a * returnA + b * returnB;

异或和问题:

1 下标0-10的数组,把数都一起异或起来->异或和        

2 把下标异或起来

3  1和2异或,最后就是缺少的1个数字或者很多数字的异或和

int main()
{
	vector<int>nums = { 1,3,0,4 };
	int a = 0, b = 0;
	for (int i = 0; i < nums.size(); i++)
	{
		a ^= i;
		b ^= nums[i];
	}

	a ^= nums.size();
	cout << (a ^ b);

	return 0;
}

  • 23
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值