求一个32位二进制数中的1的个数

别人的代码,只不过加上了我自己的理解,都在注释里面了:

// 返回一个32位二进制数中的1的个数
// 第一种方法,每四个二进制位计算一次,共需累加八次
int bitCount_1(int num)
{
	int table16[16] ={0,1,1,2, 1,2,2,3, 1,2,2,3, 2,3,3,4};
	int result = table16[num & 0xf];
	result += table16[(num>>4) & 0xf];
	result += table16[(num>>8) & 0xf];
	result += table16[(num>>12) & 0xf];
	result += table16[(num>>16) & 0xf];
	result += table16[(num>>20) & 0xf];
	result += table16[(num>>24) & 0xf];
	result += table16[(num>>28) & 0xf];
	return result;
}
// 第二种方法,每八个二进制位计算一次,共需累加四次
int bitCount_2(int num)
{
	int table16[16] ={0,1,1,2, 1,2,2,3, 1,2,2,3, 2,3,3,4};
	int table256[256];
	
	for(int i = 0; i < 16; ++i)
		for(int j = 0; j < 16; ++j)
			table256[16*i + j] = table16[i] + table16[j];

	int result = table256[num & 0xff];
	result += table256[(num>>8) & 0xff];
	result += table256[(num>>16) & 0xff];
	result += table256[(num>>24) & 0xff];
	return result;
}
// 第三种方法
// 思路:先计算每相邻两个二进制位中1的个数,结果放在16对二进制位中。
// 然后再将相邻两对的数目求和,结果放在了8对(每一对占4位)中,再对相邻两对求和,结果放在了4对(每对占8位)中,一次类推,最后将剩余的两对(每对16位)相加
// 就是总的1的位数。
int bitCount_3(int num)
{
	num = (num & 0x55555555) + ((num>>1) & 0x55555555);
	num = (num & 0x33333333) + ((num>>2) & 0x33333333);
	num = (num & 0x0f0f0f0f) + ((num>>4) & 0x0f0f0f0f);
	num = (num & 0x00ff00ff) + ((num>>8) & 0x00ff00ff);
	num = (num & 0x0000ffff) + ((num>>16) & 0x0000ffff);
	return num;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值