位运算符的一些技巧

用位运算符交换两个变量的值

先介绍一下位运算符

&与

|或

^异或

~非

代码
a=a^b;
b=a^b;
a=a^b;
解释

第一句:相当于把a和b存到a里面,在下面的语句中请将a看成a^b,可能就会豁然开朗

第二句:b=a ^ b ^ b =a;

第三句: a=a ^ b ^ b = b;

原理:

(1)一个变量按位异或自己的结果为0,即:a ^ a = 0;

(2)一个变量按位异或0的结果为自己,即:a ^ 0 = a;

判断奇偶

x&1==1 奇数

x&1==0 偶数

除以2

原先我们除以2,都是a/=2,但是用运算符来计算,如:a>>1,就相当于除以2,而且计算会更快一点.

甚至有时为了防止int内存不够,发生溢出,我们不得不用位运算。

int mid = (low+high)/2;			//可以用以下语句替换
int mid = low+ (high-low)>>1;

找出重复的那个数

题目:有1~1000,所有的数都只出现一次,但是会有一个数出现2次,把那个数找出来

这个题目可以用异或来求解,把所有的数异或起来,再异或一次1~1000,把只出现一次的数消掉,而出现2次的数,在异或对里面,出现了3次,它会被保留下来。

核心代码

int x = arr[0];
for (int i = 1; i <= N-1; i++)
{
    x ^= arr[i];			//把所有的出现数异或起来,重复的数反而会被消掉,单独的数留下来了。
}
for (int i = 1; i <= N - 1; i++)
{
    x ^= i;			//把所有的数异或起来,但这一次是把已知的数列异或起来,每个只异或一次。
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值