【C语言】1的个数

【C语言】1的个数

前言

大家好,我是真的王,一个正在努力变强的小白。

一、第一种算法

#include

int main()

{

int n = 0;

int m = 0;

int count = 0;

scanf("%d", &n);

while (n)

{

m = n % 2;

n = n / 2;

if (m == 1)

{

count++;

}

}

printf("%d\n", count);

return 0;

}

但这种算法有一个问题,它只能计算正整数中一的个数。

二、改进算法

前一种算法没有讨论负数情况。

例如:5的二进制为00000000000000000000000000000101

-5的二进制为10000000000000000000000000000101

负数与正数相差一个符号位1,我们可以先计算负数的相反数再加上符号位1就可以完善该算法。

#include

#include

int main()

{

int n = 0;

int m = 0;

int u = 0;

int count = 0;

scanf("%d", &n);

u = abs(n);

while (u)

{

m = u % 2;

u = u / 2;

if (m == 1)

{

count++;

}

}

if (n > 0)

{

printf("%d\n", count);

}

else

{

printf("%d\n", count + 1);

}

return 0;

}

三、其他思路

上述代码过于复杂且不简洁,既然要计算二进制中的1的个数,我们可以直接操纵二进制来达到计算1的个数。

我们可以想到&(按位与),它对于两个操作数的二进制数进行操作。

例如:5的二进制00000000000000000000000000000101,它&-5

结果为5( 00000000000000000000000000000101).

所以我们可以进行位操作来求得1的个数。

#include

int main()

{

int n = 0;

int count = 0;

scanf("%d", &n);

while (n)

{

if (n & 1 == 1)

{

count++;

n = n >> 1;

}

else

n = n >> 1;

}

printf("%d\n", count);

return 0;

}

💡 相关推荐

線上免費照片換背景
365bet中文资讯网

線上免費照片換背景

📅 06-27 👀 1355
科普文章
365即时比分足球

科普文章

📅 06-29 👀 8789
网络电话
完美365体育app下载安装

网络电话

📅 07-01 👀 3001