实现一个函数的二进制有几个1
1.方法一:利用除法和取余,如下图所示:
int NumOf1(int x) {
int count = 0;
while (x) {
if (x % 2 == 1) {
count++;
}
x /= 2;
}
return count;
}
int main() {
int num = 11;
int n = NumOf1(num);
printf("%d的二进制中有几个1:%d\n", num, n);
return 0;
}
结果:
当对负数进行计算时出错,因为负数不能进行%运算。
2.方法二:数按位右移与1相与
int NumOf1(int x) {
int count = 0;
for (int i = 0; i < 32;i++) {
if ( (x>>i)&1 == 1) {
count++;
}
}
return count;
}
int main() {
int num = -1;
int n = NumOf1(num);
printf("%d的二进制中有几个1:%d\n", num, n);
return 0;
}
该方法负数时同样可用,但是该方法需要移动32次位置,但实际有些数并不需要移动那么多次,比如5移动3次就可以。
3.方法三:
int NumOf1(int x) {
int x = 0;
int count = 0;
while (x) {
x = x & (x - 1);
count++;
}
return count;
}
int main() {
int num = -1;
int n = NumOf1(num);
printf("%d的二进制中有几个1:%d\n", num, n);
return 0;
}
该方法同样适用于负数,但是该方法减少移动次数,优化代码。