C语言三种方法求一个数二进制序列中出现1的次数

第一种方法,模2除2法。一个二进制序列通过模2运算,可以求得它的最末位数字,通过除2运算,可以去掉最末位的数,如此循环,如果模2的结果是1,那么给计数器加1, 最后输出计数器的值,即出现1的个数。但这种方法只能求一个正数二进制序列出现1的次数,因为如果是负数模2的结果会永远都是0,而count也就永远都是0。具体实现代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int count_one_bits(unsigned int n)
{
 int count = 0;
 while (n)
 {
  if (n % 2 == 1) //n%2求得二进制序列末位上面的数,如果等于1则count+1
  {
   count++;
  }
  n = n / 2;  //n/2去掉二进制最末位的数
 }
 return count;  //返回count的值。 函数返回值为int时必须有返回值
}
int main()
{
 int num = 0;
 printf("请输入一个数:");
 scanf("%d", &num);
 int ret = count_one_bits(num);//将实参num传入函数的形参中
 printf("%d\n", ret);
 system("pause");
 return 0;
}

第二种方法,将这个数与1按位与,如果最末位的数是1的话,那么按位与的结果为1,如此循环32次,每次当按位与的结果为1时,给计数器加1,然后进行右移运算,判断倒数第二位与1相与是否为1,最后输出计数器的值,即出现1的个数。具体实现代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int count_one_bits(unsigned int n)
{
 int i = 0;
 int count = 0;
 for (i = 0; i < 32; i++)
 {
  if (((n >> i) & 1) == 1)   //一个数与1相与如果这个数的二进制序列最末位为1则相与的结果为1
  {
   count++;
  }
 }
 return count;
}
int main()
{
 int num = 0;
 printf("请输入一个数:");
 scanf("%d", &num);
 int ret = count_one_bits(num);//将实参num传入函数
 printf("%d\n", ret);
 system("pause");
 return 0;
}

第三种方法, 将这个数与这个数减1的值按位与, 然后将结果赋给这个数,如此循环。 具体实现代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int count_one_bits(unsigned int n)
{
 int count = 0;
 while (n)
 {
  n = n & (n - 1);
  count++;
     }
 return count;
}
int main()
{
 int num = 0;
 printf("请输入一个数:");
 scanf("%d", &num);
 int ret = count_one_bits(num);//将实参num的值传递入函数
 printf("%d\n", ret);
 system("pause");
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值