求一个整数存储在内存中的二进制中1的个数
程序员文章站
2022-07-15 09:49:59
...
对于一个整数,存储在计算机内存中的是补码。
对于一个正数,其原码,反码,补码都是一样。
对于一个负数,求其二进制原码后,取反加一得到补码,存储到内存之中。
对于求一个整数存储在内存中二进制1的个数,有如下3个方法。
第一种 逻辑左移
int main()
{
int num = 0;
int count = 0;
scanf("%d", &num);
//统计num中的补码中有多少个1
//32bit
//num & 1 == 1
//例如:3
// 00000000000000000000000000000011
// 00000000000000000000000000000001
//相与得: 00000000000000000000000000000001
// 将1逻辑左移一位变为:
// 00000000000000000000000000000011
// 00000000000000000000000000000010
//相与得: 00000000000000000000000000000010
int i = 0;
for (i = 0; i < 32; i++)
{
// num>>i,num逻辑右移i位
if ((num & (1<<i)) == (1 << i))
count++;
}
printf("%d\n", count);
return 0;
}
第二种 逻辑右移
int main()
{
int num = 0;
int count = 0;
scanf("%d", &num);
//统计num中的补码中有多少个1
//32bit
//num & 1 == 1
//例如:3
// 00000000000000000000000000000011
// 00000000000000000000000000000001
//相与得: 00000000000000000000000000000001
// 将num逻辑右移一位后变为:
// 00000000000000000000000000000001
// 00000000000000000000000000000001
//相与得: 00000000000000000000000000000001
int i = 0;
for (i = 0; i < 32; i++)
{
// num>>i,num逻辑右移i位
if (1 == ((num >> i) & 1))
count++;
}
printf("%d\n", count);
return 0;
}
第三种 这种方法只适用于正数
int main()
{
int num = 0;
int count = 0;
scanf("%d", num);
//统计num中的补码中有多少个1
while (num)
{
if (num % 2 == 1) {
count++;
}
num = num / 2;
}
printf("%d\n", count);
return 0;
}
推荐阅读
-
剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)
-
用C语言写一个函数返回参数二进制中1的个数
-
我们在删除SQL Sever某个数据库表中数据的时候,希望ID重新从1开始,而不是紧跟着最后一个ID开始需要的命令
-
[c语言]统计一个数二进制中的1的个数
-
LeetCode 1 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
-
1.无符号整数的二进制中1的个数2.十进制数转化为二进制数
-
写一个函数返回参数二进制中 1 的个数
-
写一个函数返回参数二进制中 1 的个数
-
写一个函数返回参数二进制中 1 的个数
-
写一个函数返回参数二进制中1的个数