二分法与异或的使用

异或的使用:

  1. 概念:相同为0,不相同为1 (简单记忆:不进位相加即为异或)

比如说:

00011010

(异或)

10010100

= 10001110

  1. [danger]用法:a^0 = a    a^a=0   a^a^a=a[/danger]

  1. 实例:
  • 一、两个数互换 (a,b)  则可以这样操作:a = a ^ b , b = a^b (此时得到b等于a) , a = a ^ b(此时得到a等于b)
  • 二、找到一个数组中唯一为奇次数的哪个数 [ 1,1,2] 此时唯一为奇次数的为

核心代码: int num = 0;  然后一直让其与数组的数异或即可    总的来看就是num = 0^1 ^ 1 ^2(偶次数的数将会抵消)

  • 三、扩展:找到一个数组中的两个奇次数的数 [1,2,2,3] 此时的两个奇次数为1,3

我们需要一个额外的知识点:就是找到一个数的二进制数最后一个为1的位

比如 a = 0001 1100 找到红色的1 ,则可以 b = a & (~a + 1)

a=0001 1100  ~a = 1110 0011   ~a+1 = 1110 0100  会发现a与~a+1后会得到 c =0000 0100

那么我们得到 0000 0100有什么用呢?

首先我们使用  二  中的方法可以得到 num = a ^ b (a,b即为我们需要的两个数),num的二进制数中的最后一个为1的位肯定是因为a和b在这个位置上不一样。此时我们便可以把a和b分为两个阵营了(某位数为1的,和某位数为0的)

此时再次遍历数组,将某位数为1(怎么判断?Tmp ^c!=0 )的全部异或(那么我们便可以得到a或者b了),得到其中一个数后,另外一个数我们可以使用 num ^ 得到的数 即为另一个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值