算法:神奇的 i & (i-1)

今天写给今年校招生的iOS面试题解是遇到一个有意思的C算法题:

#include 

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。

在本题中即数出2017转换成二进制有几个1就会走几次循环。
2017对应的二进制是:10000111111,一共7个1,故走7次。

拓展:(n > 0 && ((n & (n - 1)) == 0)是判断n是不是2的次幂

你可能感兴趣的:(算法:神奇的 i & (i-1))