C语言中,整数的存储是的补码形式
5 00000000000000000000000000000101 原码
5 00000000000000000000000000000101 反码
5 00000000000000000000000000000101 补码
-1 10000000000000000000000000000001 原码
-1 11111111111111111111111111111110 反码
-1 11111111111111111111111111111111 补码 计算机以补码形式存储 32个1
unsigned,声明无符号类型,来计算负数返回参数二进制中1的个数
第一种方法
利用整数的%,/运算,例如:5%2=1, 5/2=2, 2%2=1 可知返回参数二进制中1的个数
int count_nums_of_1(unsigned int n)
{
int count = 0;
while (n)
{
if ((n % 2) == 1)
{
count++;
}
n = n / 2;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = count_nums_of_1(n);
printf("%d\n", ret);
}
第二种方法
利用&运算,整数&1=1,判断是否为1。循环32次,向右偏移一位计算1的个数
int count_nums_of_1(unsigned int n)
{
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)//
{
count++;
}
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = count_nums_of_1(n);
printf("%d\n", ret);
}
第三种方法
利用n=n*(n-1) ,循环往复
n = 5
n = n&(n-1)
00000000000000000000000000000101 5 n
00000000000000000000000000000100 4 n-1
00000000000000000000000000000100 4 n&(n-1)
00000000000000000000000000000100 4 n
00000000000000000000000000000011 3 n-1
00000000000000000000000000000000 0 n&(n-1)
int count_nums_of_1(unsigned int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = count_nums_of_1(n);
printf("%d\n", ret);
}
如有其他方法,欢迎评论区讨论