方法一:求余法
#include<stdio.h>
#include<stdlib.h>
int main()
{
int num = 9;
int count = 0;
int count_one_bits(int num);
while (num)
{
if (num % 2 == 1)
count++;
num = num / 2;
}
printf("count = %d", count);
system("pause");
return 0;
这种方法求正数可以,负数时会出错,
方法二:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int num = -11;
int count = 0;
int count_one_bits(int num);
{
int i = 0;
for (i = 0; i < 32; i++)//整形有32个比特位;
{
if (num&1 == 1)
count++;
num = num >> 1;//位右移;
}
}
printf("count = %d\n", count);
system("pause");
return 0;
}
负数在计算机内部是用补码表示的
例如 -1
1的原码是 0000 0001
则-1的反码是 1111 1110
补码是 1111 1111
方法三:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int num = -11;
int count = 0;
int count_one_bits(int num);
{
while (num)
{
count++;
num = num&(num - 1);
}
}
printf("count = %d\n", count);
system("pause");
return 0;
}
用的位运算的按位&。
注意:逻辑运算符“与&&“、”或|“|和位运算符”与&“、或|的区别
逻辑运算是指对表达式返回值的运算,这里的值只有真与假;按位运算是指数值或操作数转换为二进制后的位运算,每位是0或1(上一篇提到,不赘述)
逻辑与&&两种情况同时为真,结果为真,如:
5>3&&3>2值为1,这里1表示条件为真。
逻辑或两种情况有一个为假,结果就为假。如:
5>2||1>3值为0.
当然还有很多不完善的地方,希望各位热心的网友一起探讨,共同努力进步。