异或运算
对两个整数进行异或运算(运算符为^),将两个整数化成二进制表示,然后逐位运算。运算规则如下:
0 ^ 0 = 0;
0 ^ 1 = 1;
1 ^ 0 = 1;
1 ^ 1 = 0;
即两个位相同时,异或结果为0,反之,异或结果为1.
因此,两个相等的整数异或结果为0
例题一
题目描述
一堆整数中(2*n+1 个),除了一个整数与其它所有整数互不相同外,其它整数两两相同,要求找出这个整数。
思路
巧妙使用异或运算,根据两个相同的整数异或结果为0。从第一个元素开始,逐个异或后面所有整数,最终结果即为要找的整数。
代码
#include <stdio.h>
#include <conio.h>
#define NUM 19
int main()
{
int input[NUM] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
int result;
result = input[0];
for (int i = 1; i < NUM; i ++)
result = result ^ input[i];
printf("%d\n", result);
getch();
return 0;
}
例题二
题目描述
一堆整数中(2*n+2 个),除了有两个整数与其它整数不相同外,其它整数两两相同,要求找出这两个整数。
思路
先从第一个元素开始,逐个异或所有的整数,得出最终结果。将异或结果用二进制表示,找出为1的最低位。
按照这一位的不同将所有整数分成两组,每组包含一个与其它整数都不相同的整数。分别将两个组中的整数异或,即可得到最终的结果。
代码
#include <stdio.h>
#include <conio.h>
int findLowBit(int xorResult);
void ini(int input[]);
#define NUM 200
int main()
{
int input[NUM];
ini(input);
int xorResult;
int i;
xorResult = input[0];
for (i = 1; i < NUM; i ++)
xorResult = xorResult ^ input[i];
int lowBit = findLowBit(xorResult);
int result1 = 0;
int result2 = 0;
for (i = 0; i < NUM; i ++)
{
if (((input[i]>>lowBit)&1) == 0)
result1 = result1 ^ input[i];
else
result2 = result2 ^ input[i];
}
printf("%d %d\n", result1, result2);
getch();
return 0;
}
int findLowBit(int xorResult)
{
int result = 0;
while ((xorResult & 1) == 0)
{
result ++;
xorResult = xorResult >> 1;
}
return result;
}
void ini(int input[])
{
for (int i = 0; i < 99; i ++)
{
input[i] = i;
input[200-1-i] = i;
}
input[99] = 8888;
input[100] = 9999;
}