神奇的 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的次幂

posted @ 2020-05-17 19:48  ジャスミン  阅读(1638)  评论(0编辑  收藏  举报