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

整数的二进制表示中1的个数

时间:2015-01-12 09:25:34      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:二进制   1的个数   与运算   位移   

给出通常能想到的方式,这两种方式在《C和指针》一书中给出。以下讨论的均为非负整数。

/*
该方法每次在循环中判断数的二进制最右一位是否为1(如果该数能不能被2整除)。
每次循环后该数右移一位。因此遍历了数的二进制表示的每一位。
*/
int count_one_bits1(int value) {
	int count;
	for (count = 0; value != 0; value >>= 1)
		if (value % 2 != 0)
			count++;
	return count;
}

/*
与上边方法类似,也是每次将该数右移一位,遍历该数的二进制表示的每一位。
不过这里是将该数与1做与运算,这样,与的结果不为零则说明该数的二进制表示的最右一位为1。
*/
 int count_one_bits2(int value) {
	int count;
	for (count = 0; value != 0; value >>= 1) {
		if ((value & 1) != 0)
			count++;
	}
	return count;
}

下面介绍另外一种方式,可以通过比上述少的比较次数来统计出数的二进制表示中1的个数。

首先作如下分析:

          当一个数value是2的n(n > 0)次幂时,该数的二进制表示中必然仅在最高位包含一个1,那么value -1 的二进制形式必然是一个除了最高位其他位均为1的数;因此

value &  (value - 1)的结果必然为0。那么问题来了:

可以由此得出判断数value是否是2的n次方的方法:

 ! (value & (value - 1))为真表示该数是2的n次幂,为假表示该数不是2的n次幂。


因此,如果某数value满足value & (value - 1) = 0,证明该数中仅包含一个1。看下面的函数:

int count_one_bits3(int value) {
	int count = 0;
	while (value) {
		count++;
		value = value & (value - 1);
		int v1 = value;
		cout << value << " ";
	}
	cout << endl;
	return count;
}

while循环结束的条件是value为0,也就是当value是2的n次幂时,下一次循环就结束了,因为2的n次幂的二进制表示中仅含有一个1。循环中value = value & (value - 1)使得每次循环后,value的二进制表示中1的个数少一个。该方法与前两个方法比,循环的次数少。

如下图,输入value为8888,可以看出方法1执行while循环14次,方法3执行while循环6次。方法3每次循环后value的二进制中1的个数少一个。

技术分享

整数的二进制表示中1的个数

标签:二进制   1的个数   与运算   位移   

原文地址:http://blog.csdn.net/u013074465/article/details/42617293

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