今天写给今年校招生的iOS面试题解是遇到一个有意思的C算法题:
#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。
在本题中即数出2017转换成二进制有几个1就会走几次循环。
2017对应的二进制是:10000111111,一共7个1,故走7次。
拓展:(n > 0 && ((n & (n - 1)) == 0)是判断n是不是2的次幂