二进制表示中质数个计算置位
难度:简单
根据题意,遍历[left,right]每个数,求出当前数的二进制有n个1,再判断n是否为质数即可。
代码如下:
public int countPrimeSetBits(int left, int right) {
int res = 0;
for (int i = left; i <= right; i++) {
int cnt = 0;
int tmp = i;
while(tmp>0){
if (tmp % 2 == 1){
cnt++;
}
tmp /= 2;
}
if(helper(cnt)){
res++;
}
}
return res;
}
public boolean helper(int x){
if (x == 2 || x == 3 || x == 5 || x == 7 || x == 11 || x == 13 || x == 17 || x== 19){
return true;
}
return false;
}
执行结果:成功
效率不高,根据昨天学习到lowbit ( i & -i 可以求出该数二进制最后一位1所表示的十进制 ) ,可以优化如下:
// while(tmp>0){
// if (tmp % 2 == 1){
// cnt++;
// }
// tmp /= 2;
// }
while(tmp>0){
tmp -= tmp & -tmp;
cnt++;
}