按位与:a&b是把a和b都转换成二进制数然后再进行与的运算;
逻辑与:a&&b就是当且仅当两个操作数均为 true时,其结果才为 true;只要有一个为零,a&&b就为零。 


 x=9999 

 int func(x) 

    int countx = 0; 
    while(x) 
    { 
          countx ++; 
          x = x&(x-1); 
     } 
    return countx; 
}  


x = 9999 时,x-1=9998,用二进制表示

10011100001111

10011100001110

当他们执行&运算并赋值给x,结果x为

10011100001110

此时x-1为

10011100001101

当他们执行&运算并赋值给x,结果x为

10011100001100

如此类推到结果为00000000000000,应该发现x = x&(x-1)就是将x最右边的二进制位1变为0。x为9999时二进制为1的位有8个,所以结果为8