为奇数(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的个数。
如,9999 的二进制表示为: 0010 0111 0000 1111,共有8个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.