求一个整数存储在内存中的二进制中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跳出循环;
推荐阅读
-
C++实现(当n属于long范围时)给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数
-
(当n属于long范围时)给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数
-
华为机试 求int型数据在内存中存储时1的个数
-
如何求二进制数中1的个数
-
剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)
-
剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)
-
用C语言写一个函数返回参数二进制中1的个数
-
我们在删除SQL Sever某个数据库表中数据的时候,希望ID重新从1开始,而不是紧跟着最后一个ID开始需要的命令
-
[c语言]统计一个数二进制中的1的个数
-
LeetCode 1 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。