码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-09-24 16:23:07      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:编程之美   位运算   算法   注释   二进制   

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


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

标签:编程之美   位运算   算法   注释   二进制   

原文地址:http://blog.csdn.net/dlutbrucezhang/article/details/39521775

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!