求一个数的二进制1的个数的四种方法
#include<iostream>
int WayOfSubOne(int value){
int num{};
while(value){
value = value&(value - 1);
num++;
}
return num;
}
int WayOfLowBit(int value){
int num{};
while(value){
value -= value & (-value);
++num;
}
return num;
}
int WayOfBuildIn(int value){
return __builtin_popcount(value);
}
int WayOfSieve(int value) { //int 4个字节32位
value = (value & 0x55555555) + ((value >> 1) & 0x55555555); // 统计每两位1的个数
value = (value & 0x33333333) + ((value >> 2) & 0x33333333); // 统计每四位1的个数
value = (value & 0x0f0f0f0f) + ((value >> 4) & 0x0f0f0f0f); // 统计每八位1的个数
value = value + (value >> 8); // 统计每十六位1的个数
value = value + (value >> 16); // 统计每三十二位1的个数
return value & 0x3f;
}
int main(){
std::cout<< WayOfSubOne(5)<<std::endl;
std::cout<< WayOfLowBit(5)<<std::endl;
std::cout<< WayOfBuildIn(5)<<std::endl;
std::cout<< WayOfSieve(5)<<std::endl;
system("pause");
return 0;
}
见:https://www.cnblogs.com/xqxq/p/13773184.html