n为所求数: n&(n-1)去掉最后一个1
当n-1时,原来在n二进制中最右面的1变为0,最右面的1后面的所有0变为1,相当于取反
如7--------0111,6--------0110,7&6=0110,重复操作即可将n变为0,重复次数为n中1的个数
代码:
int NumberOf1(int n) {
int res=0;
while(n)
{
n=n&(n-1);
res++;
}
return res;
}
当n=0,return 0
当n为负数时,一样
如-3(以其正数的补码表示32位时)------原码:0000 0000 0000 0000 0000 0000 0000 0011
反码:1111 1111 1111 1111 1111 1111 1111 1100
补码:1111 1111 1111 1111 1111 1111 1111 1101
-4最终补码:1111 1111 1111 1111 1111 1111 1111 1100
(-3)&(-4) : 1111 1111 1111 1111 1111 1111 1111 1100
规则一样,不分正负。