最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表,位运算,数组,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; }
原文地址:http://blog.csdn.net/dlutbrucezhang/article/details/39521775