欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

求一个整数存储在内存中的二进制中1的个数

程序员文章站 2022-07-15 09:50:29
...

题目:求一个整数存储在内存中的二进制中1的个数

方法一:

	int num = 10;
	int count = 0;//计数
	while (num)
	{
		if (num % 2 == 1)
			count++;
		num = num / 2; //等价于:num = num >> 1;
	}
	printf("二进制中1的个数为:%d\n", count);

这个是比较常见的方法,如果看代码一看懵,我们可以实践一下:

num = 10 按二进制存储是:1010
第一步:进入循环,先看 num 是否可以整除以 2 ,如果可以整除以 2 ,说明num
    按十进制存储是偶数,它的二进制最低为是 0,这个时候直接执行下一条
    语句‘num = num/2’,相当于右移一位,num 由1010 => 101
第二步:num 的二进制变为101 ; 它除以2的时候就相当于5除以2,肯定不会整
    除,这是count++,记录出现的1的个数。

方法二:

这种方法虽然和第一种有不同之处,但也有很大的相似之处:
算法核心:只比较最右的那位(二进制存储的最低位)的数字,如果是1,则计数count++,右移一位,继续判断最后一位是否是1,如果不是1,直接跳过,但还是要右移一位,直到移够32次跳出循环为止。
问:那怎么判断最低位是否是1呢?
答:if (((num >> i) & 1) == 1)
最后一位数和 1 按位与,就可以判断出来。

	int num = -1;
	int i = 0;
	int count = 0;//计数
	for (i = 0; i < 32; i++)
	{
		if (((num >> i) & 1) == 1)
			count++;
	}
	printf("二进制中1的个数 = %d\n", count);

方法三:

优点:效率高,不用循环32次;
缺点:代码可读性差;

	int num = -1;
	int i = 0;
	int count = 0;//计数
	while (num)
	{
		count++;
		num = num & (num - 1);
	}
	printf("二进制中1的个数 = %d\n", count);

烧脑吧!!!!!!

用一个数字试试看你会发现每执行一次num = num & (num - 1);
num中的1就会减一,直到减为0跳出循环;