位运算练习2:有101个整数,其中有50个数出现了两次,1个数出现了一次,找出出现了一次的那个数

在一堆数中找出现了1次的数

  1. 有101个整数,其中有50个数出现了两次,1个数出现了一次,找出出现了一次的那个数。

    思路:异或:相同为0,相异为1, 任何数和0异或是自身,和自身异或是0

int main()
{
	int i;
	int t = 0;
	int a[N] = {1,2,3,4,5,6,5,4,2,3,1};
	for ( i = 0; i < N; i++)
	{
		t = t ^ a[i];
	}
	printf("%d\n", t);
	system("pause");
	return 0;
}

2 有102个整数,其中有50个数出现了两次,2个数出现了一次, 找出出现了一次的那2个数

考察分堆的思想
step1:先将所有的数异或,得到异或后的结果ret
step2:利用异或后的结果ret与分割值partition按位与,找到分割值
step3:将所有的数与分割值按位与,进行异或

int main()
{
	int i, first=0, second=0;
	int a[8] = { 9,5,6,8,5,9,7,6 };
	int ret = 0;
	int partition = 1;
	for ( i = 0; i < 8; i++)
	{
		ret = ret ^ a[i];
	}
	for ( i = 0; i < 31; i++)
	{
		if (1==(ret & partition))
		{
			break;//找到分割值则跳出循环
		}
		else
		{
			partition = partition << 1;//不断左移寻找分割值
		}
	}
	for ( i = 0; i < 8; i++)
	{
		if (partition&a[i])
		{
			first = first ^ a[i];
		}
		else
		{
			second = second ^ a[i];
		}
	}
	printf("%d %d\n", first, second);

	system("pause");
	return 0;
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值