首页 > 其他分享 >异或运算及其应用-查找奇数个数的数字

异或运算及其应用-查找奇数个数的数字

时间:2022-12-19 17:38:45浏览次数:26  
标签:运算 奇数 int res 异或 查找 90 cout


 

异或运算功能很强大。用的得当可以提高算法效率。

先说一下异或运算的运算法则:


       1.  a ^ b = b ^ a
  2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c
    3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c
       4. a ^ b ^ a = b


  对于性质1,不多说,显而易见的。

  对于性质2和4,这里最近我发现了一个重要的应用,就是可以查找出一组数列中具有奇数个数的数。比如:

题目:有2n+1个数,其中有n个数出现过两次,只有一个数字出现过一次。要求是找出这个数字。

 

   为了说明性质2和4如何使用,先举个例子:数列{2,3,4,5,6,9,6,3,2,1,5,8,4,5,5,9,8,1,8} 中8有三个,而其他数字都是2个或者2的倍数(即偶数个),那么根据性质3,我们可以得出这样的结论:

(e^e)^(f^f)^x =0^0^0^0^0^0^0^x = x;

   因为a^a = 0,含有偶数个的数字异或运算的值为0, 0^x = x 最后剩下奇数个的数字x。

   这样仅仅用了一次遍历即可找出。算法效率明显提高。


附C++代码:



#include <iostream>

using namespace std;

void main()
{
int res = 0;
int var[17] = {2,3,6,5,8,9,7,4,1,5,6,3,2,9,8,1,7};
for(int i = 0;i<17;i++)
{
res^=var[i];
cout<<res<<endl;
}
cout<<"the result is:"<<res<<endl;
}

 

对于性质3,也是蛮有趣的。这里也用C++代码验证一下:

#include <iostream>

using namespace std;

void main()
{
int i = 0;
int res = 0;
int var1[17] =

{22,3,68,5,89,9,7,4,117,12,25,3,62,90,85,10,79};
for( i = 0;i<17;i++)
{
res^=var1[i];

}
cout<<"结果是:"<<res<<endl;
//上面的结果是16,用16 随便替换以上序列中任意数字,比如

90,//那么结果应当是90
res = 0;
int var2[17] =

{22,3,68,5,89,9,7,4,117,12,25,3,62,16,85,10,79};
for( i = 0;i<17;i++)
{
res^=var2[i];

}
cout<<"验证结果是:"<<res<<endl;
//应当是90
}

 

异或运算蛮有趣的吧!

  good luck!                                  ------yaung



  

标签:运算,奇数,int,res,异或,查找,90,cout
From: https://blog.51cto.com/u_15917617/5953241

相关文章

  • linux 如何查找进程的执行路径
    1.首先查出进程号ps-aux|grep"command"或ps-fx|grep"command"2.得到进程号之后通过pwdx命令获取进程执行路径pwdxpid3.得到进程号之后通过查看/proc获取......
  • (举例)在有序数组中查找具体的某个数字n。编写int binsearch(int x,int v[],int n)数组代
    intbinsearch(intx,intv[],intn)功能:在v[0]<=v[1]<=v[2]<=...<=v[n-1]的数组中查找n以数组arr[]={1,2,3,4,5,6,7,8,9,10}为例答案:一.法一:从左到右挨个查找,找n次#include<stdio.h>in......
  • C#实现简单的异或加密,方便处理
    将本地的mp4和ts文件加密为“dj”文件,无法播放。解密则是将“dj”文件解密为mp4或ts文件。usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSy......
  • C#二分查找算法实例分析
    原文链接:https://www.jb51.net/article/65006.htminternalclassProgram{staticvoidMain(string[]args){Programprogram=newProgram();......
  • 数据结构算法 之 二分查找法(LC)
    原文链接:https://blog.csdn.net/Luckyzhoufangbing/article/details/110389523(一)定义二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。二分法查找的思......
  • Java递归查找文件位置
     packagecn.edu.lcudcc;importjava.io.File;publicclassRecursionDemo{publicstaticvoidmain(String[]args){//传入目录和文件s......
  • 二分查找python与java实现
    定义给定以下情景,假设有一个有序的数组(从大到小排列),我们需要从中找出我们所需的目标元素并返回其索引。一般的思想是可以使用for循环进行遍历,直到找到目标元素......
  • 谷歌浏览器查找Extension
    Quick-FindNextgentextsearchforChromeandOpera.PortofFirefoxQuickFindfeatures+awesomenewones.Searchresultsinonelocation.Navigatetolinks......
  • 传奇数据库怎么查看
    传奇数据库怎么查看数据库有SQL、ACC、DBC、无极等今天给大家展示的是wj数据库查看游戏数据(仅做参考)​大家在打包备份时这个就很方便在​数据编辑与备份这里就可以打包自己......
  • redis 查找模糊key [scanKeys]
    /***以count为步长查找符合pattern条件的keys**@paramredisTemplate指定redis*@parampattern匹配条件*@paramcount一次在count条记录中match符合pattern条......