用位运算符交换两个变量的值
先介绍一下位运算符
&与
|或
^异或
~非
代码
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; //把所有的数异或起来,但这一次是把已知的数列异或起来,每个只异或一次。
}
1174

被折叠的 条评论
为什么被折叠?



