原理:异或是指两个二进制数进行异或:相同为零,不同为一。
下面我用两个案例来带大家深入理解。
案例一:在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。
本题解题思路:假如我们有一个数组 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,不同为一这个原理。当我们实际解决关于二进制问题时要求我们求解并出现“不同”或“相同”这些字眼时我们可以第一时间想到异或运算可能往往会达到事半功倍的效果。
最后祝各位老铁对“异或”都能理解通透!
如果觉得小编写的还不错的话可以留下免费的三连嘛!谢谢各位老铁的支持!