计算一个整数中含1的比特数

注:代码引用自李亚锋的 《C面试真题精讲》

        解析部分为原创。原书中的解析有点不够清晰。

描述:

编写一个函数,实现功能为:输入一个无符号整数,计算出该整数中含1的比特个数。

如给定一个整数8(二进制为1000),它含1的比特数为1。


该题目的实现方法可以说是多种多样,如果不考虑效率的话,最简单的方法就是把该整数

先转换为2进制,对其每一位进行判断是否为1,然后统计总的含1的个数。

下面为代码:

#include <stdio.h>
unsigned numbits(unsigned int n);
int main()
{
	int n;

	printf("please input a number:");
	scanf("%p",&n);


	printf("the numbers is %d\n",numbits(n));

}

unsigned numbits(unsigned int n)
{
	int i=0;
	while(n>0)
	{
		n&=(n-1);
		i++;
	}

	return i;

}

结果如下:


其中精彩之处为 

n&=(n-1);
然后进行判定n是否大于0;


这种方式很巧妙的。

解析如下:

n的二进制为32位。

最右侧为1的位可能为右查第1位,或者为右查第i(1<i<=32)位。

当为右查第一位时:

n-1的二进制为,最右侧一位为0.其他31位不变。

n和n-1相与得出的结果是,最右侧一位被置0的值。


当最右侧为1的位为第i(1<i<=32)位时,即右侧的第1到i-1位都为0.

这时,n-1的操作会将第i位置0,右侧的第1到i-1位置1。而第i+1为到32位都保持不变。

而相&之后会使0位至第i位都置0。

直到n=0时,就可以计算出bit位为1的个数。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值