神奇的 i & (i-1)
#include <stdio.h> int fun(int i) { int cnt = 0; while(i) { cnt++; i = i&(i-1); } return cnt; } int main() { printf( "%d\n", fun(2017) ); return 0; }
&是按位与,对应位都为1时该位得1,否则得0。
所以 i&(i-1) 的作用:将i的二进制表示中的最低位为1的改为0。
顺便提醒: i-=i&-i 也可以写为 i=i&(i-1);
在本题中即数出2017转换成二进制有几个1就会走几次循环。
2017对应的二进制是:10000111111,一共7个1,故走7次。
拓展:(n > 0 && ((n & (n - 1)) == 0)是判断n是不是2的次幂