巧用异或运算

异或运算

        对两个整数进行异或运算(运算符为^),将两个整数化成二进制表示,然后逐位运算。运算规则如下:

        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;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值