看看大神是如何计算32位数中‘1’的个数
发布日期:2021-06-30 18:44:42 浏览次数:3 分类:技术文章

本文共 1362 字,大约阅读时间需要 4 分钟。

偶然看到一份代码,代码是计算一个int数中  ‘1’ 的个数的,当然,可能这不是什么值得讨论的事情,但如果你看看大神如何写这段代码的,就觉得这个是一个需要了解的知识。

int count_bits(int x){  register int xx=x;  xx=xx-((xx>>1)&0x55555555);  xx=(xx&0x33333333)+((xx>>2)&0x33333333);  xx=(xx+(xx>>4))&0x0f0f0f0f;  xx=xx+(xx>>8);  return (xx+(xx>>16)) & 0xff;}

咋一看,如果没有接触过这个代码的人,不看函数名的话很难看出这代码有什么用。然后,我今天把这个题目发上了知乎,竟然有网友看到过这个代码,而且,在评论留言。如下:

我承认这个是一个大神级的代码,能写出这样代码的人智商肯定是在普通人之上的,但是要是说这个代码的效率奇高,我并不是很认同。

我自己写了相同功能的代码 如下:

#include "stdio.h"#include "time.h"int count_bits(int x){  register int xx=x;  xx=xx-((xx>>1)&0x55555555);  xx=(xx&0x33333333)+((xx>>2)&0x33333333);  xx=(xx+(xx>>4))&0x0f0f0f0f;  xx=xx+(xx>>8);  return (xx+(xx>>16)) & 0xff;}int count_bits2(int x){	int i = 0;	int s = 0;	for(i = 0;i<32;i++)	{		if(x&0x01)			s ++;		x = x>>1;	}	return (s);}int main(void){	printf("%d\n",count_bits(12345678));	printf("%d\n",count_bits2(12345678));}

我这个代码接触过一两天代码的同学也能够看得懂。但是我写的这段代码就一定效率非常低下吗?

我并不觉得,虽然我的代码算法复杂度是O(n),但是我的for循环里面固定是32,你们可知道32是一个常数,既然是常数,我觉得就可以跟上面的代码比较比较。如果我的for循环会无限增大,我觉得可以理解上面的代码可以秒杀我的代码。

而且从可读性上来看,我觉得我的代码可读性更加强一些。如果是有人来维护我的代码,也会比较容易上手。

但是大神这样写代码我们真的没有必要去研究吗?我觉得不然,我们了解这样的代码,是为了方便我们更好的工作,更好的去理解别人的思想。就像各个国家的语言,有不同的语言,有不同的表达方式,我们学习他们,是为了跟他们更好的交流。

前两天,我的知识星球有同学发了这样一张图片。

程序员不仅是要和代码沟通,还有和团队的人沟通,还需要和团队以外的人沟通,有时候还需要把代码的意思解释清楚给别人听,这些都需要沟通能力。而程序员最重要的沟通能力,就是和代码沟通,毕竟,你是一个程序员。

ps:想 5 块钱加入知识星球讨论的请点击下面链接。

  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

转载地址:https://linus.blog.csdn.net/article/details/105085366 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:剖析大神代码,计算整型里面1的个数
下一篇:Linux下的gpio,gpiod

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月28日 00时59分18秒