c语言按位异或^的应用实例
1.若a ^ b = c; 则有a ^ c = b, b ^ c = a;
例:将两个整形变量交换(不创建临时变量)
这里就可以用到上面得到的规律来写,在写代码之前先给上面的规律附上具体值来验证一下:
10的二进制 01010
20的二进制 10100
01010 11110 11110
^ 10100 ^ 10100 ^ 01010
11110 01010 10100
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d", a, b);
return 0;
}
如上代码就是通过异或^将两个整形变量交换的实例;
2. 连续异或:对应位上1的个数为偶数个时,最终结果对应位为0;为奇数个时,最终结果对应位为1。
例:一组数据中只有一个数字出现了一次,其他所有数字都是成对出现的,请找出这个数字。
分析问题:只有一个数字出现了一次,其他的数字都出现了两次,那么将出现两次的数字两两异或得到0,最后再异或只出现一 次的数字,结果就得到这个数字。异或没有先后次序,所以可以打乱次序,那么将这些数全部异或便可得到只出现了 一次的那个数字。
#include<stdio.h>
int find(int arr[], int len)
{
int ret = 0;
int i = 0;
for (i = 0; i < len; i++)
{
ret ^= arr[i];
}
return ret;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,7,6,4,3,2,1};
int len = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", find(arr, len));
return 0;
}