判断一个数是不是2的N次方
2的N次方(2,4,8,16… …)转换为二进制的特点是10,100,1000,10000,… …
所以比如对16使用x&(x-1) 得到10000&01111=0
所以可以由此判断一个数是不是2的N次方。
图解:
统计一个数的二进制中1的个数
实例代码:
#include <cstdio>
using namespace std;
int func(int x);
int main()
{
printf("count=%d",func(9999));
return 0;
}
int func(int x){
int count=0;
while(x){
count++;
x=x&(x-1);
}
return count;
}
输出结果:
如果输出x的值可以看到
图解:
可以看到,如果遇到0就会直接跳过这些0,转而到有1的位继续循环。