300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 编程之美2.1 求二进制中1的个数

编程之美2.1 求二进制中1的个数

时间:2020-10-24 00:24:16

相关推荐

编程之美2.1 求二进制中1的个数

最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表,位运算,数组,hash表应用等等。

由于最近事情也忙得差不多了,我重新写了一遍编程之美中的算法,在这里记录下来,以便以后阅读方便。

第一道题从2.1写起,这道题目难度不是很大,首先,给出这个题目的函数声明:

/*2.1 求二进制中1的个数*/int DutCountOf1InBin_1(unsigned int);int DutCountOf1InBin_2(unsigned int);

这里给出的是两种非常常见也非常好的算法实现,代码中已经加上了注释,所以,我直接贴出代码:

/*方法一*/int DutCountOf1InBin_1(unsigned int v){/*二进制中1的个数*/int count = 0;while (v){++count;/*每一次去掉最右边的一个1(二进制)*/v &= (v - 1);/*判断一个数是否是2的幂可以这样做:v > 0 && (v & (v - 1) == 0)*/}return count;}/*方法二*/int DutCountOf1InBin_2(unsigned int v){/*这个算法的思想就是一个数的各个相邻位的二进制1相加,最终得到总的1的个数*/v = (v & 0x55555555) + ((v >> 1) & 0x55555555);v = (v & 0x33333333) + ((v >> 2) & 0x33333333);v = (v & 0x0f0f0f0f) + ((v >> 4) & 0x0f0f0f0f);v = (v & 0x00ff00ff) + ((v >> 8) & 0x00ff00ff);v = (v & 0x0000ffff) + ((v >> 16) & 0x0000ffff);return v;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。