看看大神是如何计算32位数中‘1’的个数

偶然看到一份代码,代码是计算一个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学习资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL运算符,函数,索引,图形化管理工具

文章目录运算符算术运算符比较运算符逻辑运算符MySQL运算符数字函数字符串函数日期时间函数条件函数系统信息函数加密函数其他常用函数MySQL索引索引的概念索引的分类创建索引创建表时创建索引在已经存在的表上创建索引删除索引MySQL图形化管理工具PHPMyAdminSQLyog运算符 算术…

python list存储方式_python list存储

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

Linux下的gpio,gpiod

GPIO 应该是每个嵌入式设备都避免不了的。最近在做项目的时候&#xff0c;也遇到这方面的问题&#xff0c;所以简单总结一下现在内核里面多了gpiod的来控制gpio口&#xff0c;相对于原来的形式&#xff0c;使用gpiod的好处是我们申请后不进行free也没有什么问题。但是你要是使用…

剖析大神代码,计算整型里面1的个数

昨天的文章&#xff0c;可能很多人看了不知道怎么回事&#xff0c;确实&#xff0c;我也是看了之后一头雾水。先给出个简单的例子#include "stdio.h"int count_bits4(char x) {x (x&0x55) ((x>>1)&0x55);x (x&0x33) ((x>>2)&0x33);x…

android 复制u盘文件到手机本地_如何导出Android中的文件(把Android当做U盘)

方法一&#xff1a;1. 连接USB,插入电脑2.用手在手机上方往下滑动&#xff0c;会出现几个菜单&#xff0c;其中有一个"choose a connection type". 选择 Disk Drive.你看到的也许是&#xff0c;Charge only, 点击切换到Disk Drive.3.这时你的电脑上就会出现USB标志的…

机器学习导论 与数学分析

文章目录机器学习定义说人话例子专家系统 定义好&#xff0c; 应招&#xff0c;速度快机器学习 实验 奖惩 调参对象任务 TASK T一个或多个经验 EXPERIENCE性能PERFORMANCE类比人类学习监督学习半监督学习无监督学习增强学习可解决问题不可解决问题举例f&#xff08;x&#xff0…

聊聊、Highcharts 动态数据

最近项目中需要用到图表&#xff0c;找了几个开源框架&#xff0c;最后选择 Highcharts&#xff0c;原因是 Highcharts 功能强大&#xff0c;稳定&#xff0c;方便&#xff0c;而且开源&#xff0c;社区比较成熟。 首先下载 Highcharts&#xff0c;导入项目。 在 HTML 页面引入…

你知道用git打补丁吗?

#常规操作一个常规的使用git 生成补丁的方式git diff ./ > xxx.patch patch -p1 < xxx.patch但是这样生成的补丁有一个问题&#xff0c;这个是差分形式的diff --git a/kernel-4.4/drivers/input/touchscreen/goodix.c b/kernel-4.4/drivers/input/touchscreen/goodix.c i…

windows 禁用ipv6服务_Win10如何关闭IPV6?Win10禁用IPv6的方法

在Win10系统中默认开启IPV6&#xff0c;不过这个协议暂时我们还用不到。而且开启该协议有时对系统运行有一定的影响&#xff0c;一些网卡还会因为IPv6出现系统未响应&#xff0c;假死等情况&#xff0c;那么Win10系统怎么关闭IPV6&#xff1f;下面小编就给大家带来Win10禁用IPv…

概率论与贝叶斯先验

文章目录概率论与贝叶斯先验概率论基础问题代码图像本福特定律应用&#xff1a;公路堵车模型代码模型初速不同&#xff1a;影响不大减速概率&#xff1a;影响大应用&#xff1a;商品推荐解答概率公式应用样本贝叶斯公式分布两点分布二项分布泊松分布期望和方差表示强度应用均匀…

vue项目导入外部css样式和js文件

转自&#xff1a;http://blog.csdn.net/xiejunna/article/details/54943957 css文件放入static文件夹下。 转载于:https://www.cnblogs.com/ourLifes/p/7444074.html

Linux内核0.12完全注释

推荐一本书 Linux 0.12内核完全注释 先把麻雀解剖了&#xff0c;再去研究老鹰和飞机可能会更好。现在市面的很多书籍都是基于比较新的内核讲解的&#xff0c;2.6的内核或者4.4的内核&#xff0c;因为内核版本越高&#xff0c;里面的东西就越多&#xff0c;想要讲解明白就需要花…

iangularjs 模板,AngularJS模板中的三元运算符

How do you do a ternary with AngularJS (in the templates)?It would be nice to use some in html attributes (classes and style) instead of creating and calling a function of the controller.解决方案Update: Angular 1.1.5 added a ternary operator, so now we ca…

矩阵和线性代数

文章目录矩阵和线性代数矩阵SVD提法举例推导代码分解效果方阵行列式范德蒙行列式作用代数余子式伴随矩阵方阵的逆矩阵乘法模型举例概率转移矩阵平稳分布&#xff1a;向量乘法矩阵的秩秩与方程组的解推论向量组等价系数矩阵对CAB重认识正交阵特征值和特征向量性质不同特征值对应…

对比一段ADC键值读取的代码

最近接触到的一个代码&#xff0c;这个代码看起来很简单&#xff0c;但是却蕴藏了人类的智慧与结晶。正是这些不断产生的智慧与结晶&#xff0c;让我们的电子产品越来越稳定&#xff0c;越来越智能。周五了&#xff0c;评论文章&#xff0c;选两个同学赠送书籍《Linux内核完全剖…

HTML5权威指南 11.通信API

1 <!DOCTYPE html>2 <html>3 4 <head>5 <meta charset"UTF-8">6 <title></title>7 <script type"text/javascript">8 //&#xff08;1&#xff09;监听message事件9 window.addEve…

在线登记系统代码 php_PHP框架实现WebSocket在线聊天通讯系统

ThinkPHP使用Swoole需要安装think-swooleComposer包&#xff0c;前提系统已经安装好了SwoolePECL拓展tp5的项目根目录下执行composer命令安装think-swoole&#xff1a;composerrequiretopthink/think-swoole话不多说&#xff0c;直接上代码&#xff1a;新建WebSocket.php控制器…

Java:抽象类笔记

抽象类&#xff1a;类中没有包含足够的信息来描绘一个具体的对象。 为什么要创建抽象类&#xff1f; 为了更好的继承&#xff0c;以后能更好的扩展&#xff0c;减少类与类之间的耦合。 什么时候需要创建一个抽象类&#xff1f; &#xff08;简单粗暴的理解&#xff09;某个方法…

ios触摸超出_iOS开发笔记之多点触控(一)处理触摸的4个方法

多点触控乃苹果公司带给世界的创新之首&#xff0c;作为移动开发者&#xff0c;熟练掌握多点触控开发技能很有必要。处理触摸的四个方法&#xff1a;-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event //首次在屏幕上检测到触摸时调用{NSLog("touchesBega…

机器学习数据包之numpy

numpy 属性 import numpy as np#矩阵运算arraynp.array([[1,2,3],[2,3,4]])print (array)[[1 2 3][2 3 4]]维度 print(number of dim,array.ndim)number of dim 2形状 print(shape,array.shape)shape (2, 3)大小 print(size,array.size)size 6创建 创建类型 anp.array([…