【C语言】求一个整数存储在内存中的二进制中1的个数。

**比如:15 的二进制数位0000 0000 0000 0000 0000 0000 1111 ,则结果返回4
**
程序原型:int count_one_bits(unsigned int value)(说明:采用unsigned是int类型的-1中1的个数位32,-1是负数,在计算机中存的时补码)

(1)方法一
<类比于十进制>
例如:输出123 的每一位的数字
123%10=3
123/10=12  12%10=2
12/10=1       1%10=1

输出十进制数字的每一位采用/10 ,%10的方法,
同样地类比于十进制,二进制数就采用/2 ,%2 的方法。

#define _CRT_SECURE_NO_WARNINGS 1
int count_one_bits(unsigned int num)
{
 int count = 0;
 while (num != 0)
 {
  if (num % 2 == 1)
  {
   count++;
  }
  num = num / 2;
 } 
 return count;//返回count次数
}
int main()
{
 int num ;
 printf("请输入整数:");
 scanf("%d", &num);
 printf("整数中1的个数为:%d\n", count_one_bits(num));
 return 0;
}

(2)方法二
<用单目操作符&> (常规解法)

#define _CRT_SECURE_NO_WARNINGS 1
int count_one_bits(unsigned int num)
{
 int count = 0;
 int i = 0;
 for (i = 0; i < 32; i++)
 {
  if ((num >> i) & 1 == 1)//num右移i位与1相与,看结果是否为1.如果结果为1,num第i位为1,否则为0.总共移动32次.
  {
   count++;
  }
 }
 return count;//返回count次数
}
int main()
{
 int num;
 printf("请输入整数:");
 scanf("%d", &num);
 printf("整数中1的个数为:%d\n", count_one_bits(num));
 return 0;
}

(3)方法三
例如:求二进制数字7中1的个数(为了方便,我只写最后8位)
            0000 0111    7
         & 0000 0110    6
            0000 0110    6(结果)
         & 0000 0101    5
            0000 0100     4(结果)
         & 0000 0011    3
            0000 0000     0

二进制数7减一之后与其相与,相与三次之后为0,且7的1的个数为3。
由此可得,当num不为0时,循环num&(num-1),直到最后相与结果为0。则相与的次数就是二进制数num中1的个数。

#define _CRT_SECURE_NO_WARNINGS 1
int count_one_bits(unsigned int num)
{
 int count = 0;
 int i = 0;
 while (num!=0)
  {
  num = num&(num - 1);
  count++;
  }
 return count;//返回count次数
}
int main()
{
 int num;
 printf("请输入整数:");
 scanf("%d", &num);
 printf("整数中1的个数为:%d\n", count_one_bits(num));
 return 0;
}

以上三种代码运行结果都如下所示:
在这里插入图片描述

发布了20 篇原创文章 · 获赞 23 · 访问量 578

猜你喜欢

转载自blog.csdn.net/m0_45097186/article/details/101465504