c++位运算求一个整数二进制为1的个数

本文介绍了两种C++中求一个整数二进制表示下1的个数的方法:一是通过与操作,每次将最低位的1清除,直至变为0;二是利用移位法,检查最后一位并逐次右移丢弃1,直至数变为0。
摘要由CSDN通过智能技术生成

法一:与操作

判断一个整数的奇偶性,只要判断其二进制的最低位是1还是0。但如果N为偶数,那么N-1的二进制形式就不单单是把最低位置为0这么简单,要涉及到借位的问题。具体看下面的例子:
数字0 :0000
数字1 :0001
数字2 :0010
数字3 :0011
数字4 :0100
数字5 :0101
数字6 :0110
N为偶数,N&(N-1)的效果就是把N的从右边数起的第一个1置为0,比如6&5,是0100,把第二位的1置为0了;N为奇数,恰巧N&(N-1)能做到把最低位的1置为0的效果。
因此,我们每做一次N&(N-1)运算,就意味着把最低位的1清除了,那么1的个数就加1。第二次运算就把第一次与运算的结果,即N = N&(N-1),再做一次N&(N-1),直到把二进制中的1全部消除为止,也就是N变成全0时,循环停止。

//计算1的个数
int count1(int n)
{
	int count = 0;
	while (n != 0)
	{
		n = n & (n - 1);
		count++;
	}
	return count;
}

法二:移位法

判断这个数的最后以为是否为1,如果为1,那么加1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值