n&n(-1)
1、判断一个数是否是2的方幂
n > 0 && ((n & (n - 1)) == 0 )
2、统计一个二进制数中1的个数
while(n){
//把整数的最右边的1变成0
n=n&(n-1)
count++;
}
3、N!质因数2的个数
N-(N二进制中1的个数)
t = sum & (-sum)
求一个二进制数的最低位的1在哪里?
t=xor & (-xor)
最低位的1被与运算保留下来,其他位全部置零
-sum是负数,用补码(反码+1)表示,对于上述的与运算,sum和自己的反码按位与一定为0,但是补码是反码+1,从最低位看起,若原码为‘0’,则其补码为‘0’且向上进位,此位与结果为0;
左移一位继续分析,只要一直是0,补码也一直是0,且向上进位;
直至遇到原码为‘1’的位,此时补码也是1(0+进位的1),此位与的结果是1,其不再进位;
此时高位的与结果均为0.
最低位的1被与运算保留下来,其他位全部置零