C语言经典例题:求一个数二进制位中有几个1

C语言经典例题:求一个数二进制位中有几个1,第1张

示例: 输入7,输出3

方法一 : 假设输入7时,它的二进制表示为: 00000000 00000000 00000000 00000111

判断n是否为1—— 不是一则右移一位,同时count++(总数+1)


int Number1(int x)
{
	int count = 0;      // 存放总数
	while (x != 0)      
	{
		count++;
		x = x >> 1;
	}
	return count;
}

int main()
{
	int n = 0;
	scanf("%d", &n);                // 输入n
	printf("%d\n",Number1(n));      // 向函数传参,并将函数运行结果作为返回值传给printf,打印
	return 0;
}

这段代码,当n为负数时,无法计算出正确结果,需要在函数形参定义时,将x定义为无符号整型,unsigned int x 

方法二:& 按位与  同样假设输入为7,二进制:00000000 00000000 00000000 00000111

                                                                     1  :00000000 00000000 00000000 00000001

                                                                   n&1:00000000 00000000 00000000 00000001

               当我们需要判断这个数的最后一位是0还是1时,只需要将这个数(n)(按位与)&1 

               我们可以发现,n&1=1,则n的二进制最后一位就是1,反之则为0

下面只留下函数的实现,不再重复main函数

int Number1(int x)
{
	int count = 0;           // 总数
	while (x != 0)           // 判断,循环 
	{
		if ((x & 1) == 1)    // 最后一位为1
		{
			count++;         //  总数+1
		}
		x = x >> 1;   // x右移 
	}
	return count;
}

方法三:n = n&(n-1)的方法 

为了方便观察,只写出最后二进制的最后四位,这里我们假设输入为10

            n:1010

         n-1:1001

n=n&(n-1): 1000

          n-1 :  0111

n=n&(n-1):  0000   

也就是说,输入一个数n后,只需要与 n-1进行 &,直到n为0

如果 n 不等于 0,那么它的二进制中肯定有 1,而 n&(n-1),每次可以消去二进制形式中从右开始遇到的第一个1(过程如上),直到n=0。

int Number1(int x)
{
	int count = 0;
	while (x != 0)
	{
		x = x & (x - 1);
		count++;
	}
	return count;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/872567.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存