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

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

  1. 在所有的N位数中,有多少个数中有偶数个数字3(说明,0是偶数)?

    在所有的N位数中,有多少个数中有偶数个数字3(说明,0是偶数)? [输入格式] 读入一个数N [输出格式] 输出有多少个数中有偶数个数字3. [输入样例] 2 [输出样例] 73(由于 位数 比较大的 ...

  2. 大神教你在 Linux 中查看你的时区

    在这篇短文中,我们将向你简单介绍几种 Linux 下查看系统时区的简单方法.在 Linux 机器中,尤其是生产服务器上的时间管理技能,是在系统管理中一个极其重要的方面. Linux 包含多种可用的时间 ...

  3. linux没有tcpdump命令,大神教你在Linux中使用tcpdump命令

    一般情况下Linux系统会自带tcpdump工具,如果系统没有安装,直接用命令安装就行了. 安装命令:yum install -y tcpdump 查看安装版本命令:tcpdump --help 查看 ...

  4. 【大数据】亿级数据中判断一个数是否存在

    文章目录 问题描述 解决方案 BloomFilter(布隆过滤器) fpp 布隆过滤器的特点 布隆过滤器中的数据可不可以删除 布隆过滤器应该设计为多大? 布隆过滤器应该使用多少个哈希函数? 布隆过滤器 ...

  5. ppt录制宏_Word中录制宏,学会后成大神

    Word中录制宏,学会后成大神 Word是日常工作.生活不可避免的工具,掌握word的一些技巧,可以提高效率,让工作事半功倍,下面由办公吧(offices8.com)整理的如何在word中使用宏. 这 ...

  6. Word中录制宏,学会后成大神

    Word中录制宏,学会后成大神 Word是日常工作.生活不可避免的工具,掌握word的一些技巧,可以提高效率,让工作事半功倍,下面由办公吧(offices8.com)整理的如何在word中使用宏. 这 ...

  7. matlab ktrlink,大神们,怎么设置滑动滑动条然后出来的图形也跟着变化?

    本帖最后由 我叫W儿 于 2016-5-25 20:56 编辑 大神们!我是初学者.在GUI设计中,我把传递函数里的变量以滑动条的形式表达了,但是,运行出图后,再改变滑动条中滑块位置,图不会跟着改变. ...

  8. 大神F1 Plus和中兴V5s哪个好

    对于一些原来的手机已经满足不了现在的一些使用需求了朋友来说.换个新的手机是势在必行啊.听说酷派大神与中兴手机价格比较实惠,而且配置也相当.下面我们就来看看大神F1 Plus和中兴V5s哪个好. 下面是 ...

  9. 狼人杀服务器维护要多久,狼人杀:简单局的效率慢?大神教你如何速推简单局...

    狼人杀:简单局的效率慢?大神教你如何速推简单局 狼人杀这款以逻辑推理为主的大型桌游不仅受到广大年轻人的追捧,并快速成为了桌游界的标杆,而说到狼人杀的玩法相信大家都知道,要么狼人杀死人类,要么人类解决掉 ...

最新文章

  1. ssm 异常捕获 统一处理_SpringMVC 统一异常处理介绍及实战
  2. 卷积学习与图像识别的技术发展
  3. python写web难受-pythonweb为什么不火-问答-阿里云开发者社区-阿里云
  4. Android Drawable 转化成 Bitmap
  5. php 文章搜索,登录 - 文章搜索 - phpStudy - phpStudy
  6. 通过ping命令测试主机与虚拟机之间是否连通
  7. python打包exe报错_python 程序打包为 windows 可执行程序 exe
  8. Discuz代码研究-编码规范
  9. sklearn自学指南(part53)--高斯过程
  10. 程序为什么非得装入内存再执行?
  11. 如何用计算机装手机系统,如何使用手机给电脑安装Windows10系统?
  12. centOS服务器 netstat命令 查看TCP连接数信息(转)
  13. Map应用:电话聊天狂人
  14. 增量式编码器有哪些分类?增量式编码器是如何工作的?
  15. 安卓APP源码和设计报告——基于Android的垃圾分类系统
  16. 解决问题:cv::Exception,位于内存位置 0x000000D2956FE120 处
  17. 计算机学院青年教师讲课,【教学动态】计算机科学与信息工程学院举办首届中青年教师讲课大赛...
  18. 电路设计软件详谈,基于电路设计软件protel实现脉冲电路仿真
  19. C语言外卖订单管理系统上班,外卖订单管理系统
  20. TreeMap和TreeSet

热门文章

  1. Android加载图片OOM错误解决方式
  2. 请求地址操作中的(int*)
  3. Django REST framework 版本
  4. .net 读取mysql数据库配置文件_.NETCore添加及读取默认配置文件信息
  5. python join函数_Python join()函数
  6. JDBC笔记01-JDBC,Connection,Statement,ResultSet,PreparedStatement,Properties
  7. Django/Flask/Tornado三大web框架性能分析
  8. python编写四位数验证码
  9. C/C++宏的使用总结
  10. java递归空瓶换饮料_问题描述:一次买n瓶可乐,k个空瓶可以换一瓶饮料,那么一共能喝多少瓶饮料? | 学步园...