为奇数(n的二进制表示的末位为1):
n: xxxxxxxx1
n-1: xxxxxxxx0
n&(n-1): xxxxxxxx0
相当于去掉最右边的一个1。
n为偶数且不等于0(n的二进制表示的末位为0):
n: xxxxx1000
n-1: xxxxx0111
n&(n1-): xxxxx0000
也是相当于去掉最右边的一个1。
所以,程序的效果就是统计传入的参数的二进制表示中1的个数。
n: xxxxxxxx1
n-1: xxxxxxxx0
n&(n-1): xxxxxxxx0
相当于去掉最右边的一个1。
n为偶数且不等于0(n的二进制表示的末位为0):
n: xxxxx1000
n-1: xxxxx0111
n&(n1-): xxxxx0000
也是相当于去掉最右边的一个1。
所以,程序的效果就是统计传入的参数的二进制表示中1的个数。
如,9999 的二进制表示为: 0010 0111 0000 1111,共有8个1.
<pre name="code" class="java"> public int NumberOf1(int n) { //最优
int sum=0;
while(n!=0){
sum+=1;
n=(n-1)&n;
}
return sum;
}