当前位置:网站首页>C语言 求一个整数存储在内存中的二进制中1的个数(多种方法详解)
C语言 求一个整数存储在内存中的二进制中1的个数(多种方法详解)
2022-08-09 13:23:00 【东区东区!】
举例:8 二进制为 1000 1的个数为1
7 二进制为 0111 1的个数为3
方法一:
#include<stdio.h>
int main()
{
unsigned char n= 7;
int count = 0;
for (int i = 0; i < 8; i++)
{
if (n & 0x01)
count++;
n >>= 1;
}
printf("%d\n",count);
return 0;
}
i 可以随着你的数字大小自己调整,让输入数字的二进制最后一位每次都和1进行与运算,若都为1,则if函数内为真,执行count++,若不为1,if括号内函数为假,不执行++.
每次运行完if函数之后,将n的二进制右移一位,开始下一轮比较。
注意:在这里就学到如何看某二进制中某一位是否为1
比如 1000 0011
当你想知道第四位是否为1时
可以与 0x08 也就是0000 1000 进行 与运算 如果结果为0,那说明第四位为0
方法二:
其他内容不变:只需要对循环处加以改动
while(n)
{
int count;
if(n % 2 == 1)
{
count++;
}
n /= 2;
}本质上和方法一类似,都是对这个数二进制末尾的判断,当末尾为1时,对2取余则为1,if函数为真,执行count++。 接着对n进行/=操作,向前移动1位。
此方法与方法一比效率上未得到较大提升
方法三
此方法在前两种方法的基础上,效率大大提高,循环次数通过输入数字判断
n = 7 0000 0111
n - 1 = 6 0000 0110
&之后 0000 0110 = n
n - 1 = 0000 0101
& 0000 0100 =n
n - 1 = 0000 0011
& 0000 00000
此处经过三次 & 运算 count++ 三次 得到正确结果
#include<stdio.h>
int main()
{
unsigned char n= 7;
int count = 0;
while(n)
{
n &= (n - 1);
count++;
}
printf("%d\n",count);
return 0;
}方法四:
除此之外还有一种方法可以参考:查表法。 即提前罗列好所有结果,待数字输入后直接判断对应答案结果,这种方法的核心思想为用空间换时间,代码运算效率相比于前面几种方法来说最高,但是需要编写罗列大量结果,定义如下
int a[]={0 ,1,1,2,2,.......}定义的数组里面即8位二进制中包含所有数字的题目要求答案,我们不一一列举,这种思想在实际操作中一般很少用到,但是不妨碍我们知道学习它思想。
边栏推荐
猜你喜欢
随机推荐
【面试高频题】可逐步优化的链表高频题
NC161 二叉树的中序遍历
X264性能优化
Jetpack Compose——Image(图片)的使用
Code of Conduct for Firefighters
皮肤资料整理
机器学习web服务化实战:一次吐血的服务化之路 (转载非原创)
响应式pbootcms模板家禽饲养类网站
12.cuBLAS开发指南中文版--cuBLAS中的Level-1函数asum()和axpy()
蓝桥历届真题-跑步锻炼
Dry+Bean+Dataset R language data analysis, report in English
Q_04_05 使用Qubits
Column of openharmony container component
tianchi过往方法
RobotFramework 之 RF变量与标准库关键字使用
pyautogui的简单操作(2)-弹窗操作
JZ7 重建二叉树
源码编译安装LAMP
GridContainer of openharmony container component
pytest 之 allure报告









