求二进制中1的个数的三种方法
创始人
2024-01-26 17:15:19
0

求二进制中的1的个数

文章目录

  • 第一种方法:模2除2
  • 第二种方法:利用操作符右移后与1
  • 第三种方法:该数与上比它小1的数(最优的方法)

第一种方法:模2除2

首先明白如何得到一个数的十进制的每一位?
以123为例
123%10 = 3, 123/10 = 12
12%10 = 2,12/10=1
1%10 = 1,1/10 = 0
这样就得到了一个十进制的每一位

我们可以用这个方法类推到得到一个数的二进制的的每一位
以11为例,11的二进制为1011
11%2 = 1,11/2 = 5
5%2 = 1,5/2 = 2
2%2 = 0,2/2 = 1
1%2 = 1,1/2 = 0
顺序不重要,重要的是我们通过模2得到了三个1,说明11的二进制有三个1

以此为根据设计程序
在这里插入图片描述

int main()
{int n;scanf("%d", &n);int count = 0;while (n){if (n % 2 == 1) count++;n /= 2;}printf("%d\n", count);return 0;
}

但是这种方法是有缺陷的,就是不能统计负数的补码中的二进制的1的个数

第二种方法:利用操作符右移后与1

在这里插入图片描述

代码如下:
在这里插入图片描述

int main()
{int n;scanf("%d", &n);int count = 0;for (int i = 0; i < 32; i++)if ((n >> i & 1) == 1) count++;printf("%d\n", count);return 0;
}

但是这种方法也有缺陷,就是不管是什么数都必须要循环32次,效率并没有那么高

第三种方法:该数与上比它小1的数(最优的方法)

在这里插入图片描述
代码如下:
在这里插入图片描述


int main()
{int n;scanf("%d", &n);int count = 0;while (n){count++;n = n & (n - 1);}printf("%d\n", count);return 0;
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...