异或的妙用

整理自csdn论坛里的一个帖子!

有两个文件A,B。
A文件中存储了N个整形数(N可能很大,里面的数可以重复)。
B文件比A文件少了一个数,其他的全部相同,但顺序不一样。
设计一个方法,判断B文件中比A文件少了哪个数。

思路:     int A = A1^A2^A3^...^An
              int B = B1^B2^B3...^Bn-1;
               那么所求的那个数
              int c= A^B.

程序:


#include <stdio.h>
void main()
{
    int A[]={1,2,3,4,5,6,7,8,9,10 ,9,8,7,6,5,4,3,2,1};
    int B[]={1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,9};
 
    int x = 0;
    for( int i=0;i<19;++i)
    {
      x ^= A[i];
   }
   for( int j=0;j<18;++j)
   {
      x ^=B[j];
   }
     printf("%d/n",x);
}

异或还可用来交换两个整数的值时不用第三个参数.

如a=11,b=9.以下是二进制
a=a^b=1011^1001=0010;
b=b^a=1001^0010=1011;
a=a^b=0010^1011=1001;
这样一来a=9,b=11了。

比较下题:

1~1001放在1000大小的数组里,然后判断哪个数没有存进去。

思路:因为该题的数字较小,不考虑溢出,可分别求和将1+2+.....+1001=sum1, a[0]+a[1]+......+a[999]=sum2;然后相减求差,sum1-sum2的结果就是没有存进去的数.由于上题的数字可能很大需要考虑溢出问题,所以用异或法最优.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值