一、用位运算实现普通运算的效果
a+b
// int a,b; 求a+b
while(b!=0){
int carry=(a&b)<<1; //进位
a=a^b; //原位结果
b=carry;
}
return a;
a/2=a>>1
- a%2=a&1
- 取第i位 :a&(1<<i)
- 将位数最靠后的1变成0:a&(a-1)。应用:数1的个数
- 异或的性质 ^
- a^a=0,0^y=y
- 交换律
- 应用:求0-n中遗漏的数字。使所有数字异或的结果再依次与0-n异或
二、一个数组中只有一个数只出现一次,其他数都出现N次,求那个出现一次的数
如果N为偶数,所有数全部异或,得到的结果就是那个出现一次的数。因为相同的数异或偶数次后一定为0,0和a异或得到a。
如果N为奇数,则每一个数用二进制表示,出现重复的数其第i位叠加的结果对于重复次数取余一定是0,如果所有数第i位叠加后取余结果为1,说明单独出现一次的数在该位上是1,否则是0.