关闭

异或的妙用

1202人阅读 评论(0) 收藏 举报

整理自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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:67638次
    • 积分:958
    • 等级:
    • 排名:千里之外
    • 原创:29篇
    • 转载:4篇
    • 译文:0篇
    • 评论:16条
    最新评论