C语言——关于“异或”问题的理解

原理:异或是指两个二进制数进行异或:相同为零,不同为一

下面我用两个案例来带大家深入理解。


案例一:在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。

本题解题思路:假如我们有一个数组 1 2 3 4 5 4 3 2 1要求我们找出没有成对的那个数字5对吧,那应该怎么找呢?这是异或肯定是我们的优先选择,因为这里我们知道异或:相同为零,不同为一。我们可以将这些数进行两两异或最后根据异或原理就能解决。

实战:

int find(int arr[], int sz)
{
	int ret = 0;
	for (int i = 0; i < sz; i++)
	{
		ret = ret ^ arr[i];//进行两两异或
	}
	return ret;
}
int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算arr中的个数
	int dog = find(arr, sz);
	printf("dog=%d", dog);
	return 0;
}

运行代码:

总结:本题充分利用异或原理即可轻松解决。

案例2:求两个数二进制中不同位的个数

本题解题思路:首先我们应该明白每个数的二进制数都有32位,本题实际求解的是这两个数32位中不同的个数,这时我们应该联想到要求不同的两个数这时我们就会想到异或:相同为零,不同为一,先把这两个数进行异或,然后得到的这个数的二进制中1的个数就是这两个数二进制中不同位的个数。

实战:

int bit(int m, int n)
{
	int count = 0;
	int temp = m ^ n;//将这两个数进行异或
	while (temp != 0)
	{
		count++;
		temp = temp & (temp - 1);
	}
	return count;
}
int main()
{
	int m, n;
	scanf("%d %d", &m, &n);
	int ret = bit(m, n);
	printf("%d\n", ret);
	return 0;
}

运行代码:

总结:这两个案例都充分利用了异或:相同为0,不同为一这个原理。当我们实际解决关于二进制问题时要求我们求解并出现“不同”或“相同”这些字眼时我们可以第一时间想到异或运算可能往往会达到事半功倍的效果。

最后祝各位老铁对“异或”都能理解通透!

如果觉得小编写的还不错的话可以留下免费的三连嘛!谢谢各位老铁的支持!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值