a&1==1a&1==0原理:任何偶数二进制第一位数必定0,而奇数必定是1,而1的二进制就是1,
void swap(int* a, int* b) {
*a ^= (*b);
*b ^= (*a);
*a ^= (*b);
}
虽然没有用到中间变量,但还是得把a、b的地址传过来。
乘:
a<<n
除:
a>>n
a>>i&1
a % (2^n) 等价于 a & (2^n - 1)
a=(~a+1);
int average(int a, int b) {
return (a & b) + ((a ^ b) >> 1);
}
对于两个整数a,b,如果用 (a+b)/2 求平均值,会产生溢出,因为 a+b·可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的。
bool power2(int a) {
return ((a & (a - 1)) == 0) && (a != 0);
}