编程之美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;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值