统计一个数中含有1的个数的不同方法

本文介绍了几种不同的方法来计算整数二进制表示中1的个数,并提供了一个示例程序,展示了如何使用这些方法及计算两个数之间的位差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<iostream>
using namespace std;
int count_1(int num)
{
int count = 0;
int re = 0;
int div = 0;
if (num < 0)return 0;
div = num;

do
{

re = div % 2;
if (re == 1)
count++;
div = div / 2;



} while (div>0);


return count;
}
//保证既可以是正数也可以是负数
int count_11(int n)
{
int flag = 1;
int count = 0;
while (flag)
{
if (n&flag)
count++;
flag = flag << 1;
      
}
return count;



}
//把一个整数减1,再和原来的数与,会把该整数最右边的一个1变为0.那么一个整数的二进数有多少个1,就可以进行多少次这样的操作
int count_111(int n)
{
int count = 0;
while (n)
{
++count;
n = (n - 1)&n;
}
return count;
}//输入两个数M和N,计算需要改变M的二进制表示中的多少位才能得到N
//思路:首次两个数异或,就算异或的结果又多少个1
int tranfer(int M, int N)
{
int R = M^N;
int count = 0;
while (R)
{
++count;
R = (R - 1)&R;
}
return count;


}
void main()
{
int number = 0xf2;
int res = count_1(number);
int res1 = count_11(number);
int res3 = count_111(number);
int res4=tranfer(7,3);
cout << res<<"\n" <<res1<<"\n"<<res3<<"\n"<<res4<< endl;
system("pause");




}
### C语言实现计算整二进制表示中1量 #### 方法一:逐位检查法 通过循环遍历每一位来检测是否为`1`,并累加计器。 ```c #include <stdio.h> int count_one_bits(int n){ int count = 0; for (int i = 0; i < 32; ++i) { if ((n >> i) & 1 == 1) count++; } return count; } int main(){ int num; printf("请输入一个:"); scanf("%d", &num); printf("二进制中1个数:%d\n", count_one_bits(num)); return 0; } ``` 这种方法适用于固定长度的数据类型,比如32位整型变量[^2]。 #### 方法二:移除最低位的'1' 利用按位运算特性,每次将最右边的一个`1`变为`0`直到整个数值变成零为止。此方式效率更高因为不需要处理所有的比特位而是仅针对存在的`1`s操作。 ```c #include <stdio.h> int numberOfOnes(int n){ int cnt = 0; while (n != 0){ n &= (n - 1); // 将当前最小的‘1’置为‘0’ cnt++; } return cnt; } int main(){ int number; printf("输入要测试的字:"); scanf("%d",&number); printf("该含有%d个'1'\n",numberOfOnes(number)); return 0; } ``` 这种技术特别适合用来快速判断给定正整是否属于2的幂次方形式——如果某整恰好有且仅有一次出现过`1`则其必然是某个2的指项[^3]. #### 方法三:查表法(预定义组) 预先构建好一张表格保存从0到最大可能值之间所有整对应的汉明重量(即其中含有的`1`的量),查询时只需直接索引即可得到结果。不过这通常只用于特定场景下的优化,在通用编程环境中不太实用由于占用额外空间资源较多。 对于上述提到的各种方案而言,选择哪一种取决于具体应用场景的要求以及性能考量因素。当面对较大规模数据集或是追求极致速度的情况下可以优先考虑第二种方法;而对于小型项目或者学习练习来说第一种做法已经足够满足需求了[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值