小言_互联网的博客

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

265人阅读  评论(0)

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


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

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

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

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


   
  1. #include "stdio.h"
  2. #include "time.h"
  3. int count_bits( int x)
  4. {
  5. register int xx=x;
  6. xx=xx-((xx>> 1)& 0x55555555);
  7. xx=(xx& 0x33333333)+((xx>> 2)& 0x33333333);
  8. xx=(xx+(xx>> 4))& 0x0f0f0f0f;
  9. xx=xx+(xx>> 8);
  10. return (xx+(xx>> 16)) & 0xff;
  11. }
  12. int count_bits2( int x)
  13. {
  14. int i = 0;
  15. int s = 0;
  16. for(i = 0;i< 32;i++)
  17. {
  18. if(x& 0x01)
  19. s ++;
  20. x = x>> 1;
  21. }
  22. return (s);
  23. }
  24. int main(void)
  25. {
  26. printf( "%d\n",count_bits( 12345678));
  27. printf( "%d\n",count_bits2( 12345678));
  28. }

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

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

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

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

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

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

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

我有个问题

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

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


转载:https://blog.csdn.net/weiqifa0/article/details/105085366
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场