整数在内存中是以二进制补码的形式存在的。
正数的原码、补码、反码都相同,为整数的二进制形式,最前边的一位符号位为0;
负数的原码、补码、反码各不相同。原码为整数的二进制数,最前边的符号位为1,反码符号位不变其他位对原码按位取反,补码在反码的基础的上加1。
求整数存储在内存中1的个数:
法一:整数模二除二,余1时count++
#include<stdio.h>
int main()
{
int num = 0;
int count = 0;
scanf("%d", &num);
int i = 0;
//统计num的补码中有几个1
//模仿十进制模十除十 -- 二进制中模二除二
while (num)
{
if (num % 2 == 1)
count++;
num = num / 2;
}
printf("%d\n", count);
return 0;
}
法二:利用右移操作符和按位与操作符
算术右移操作符:右边丢弃,左边补原符号位
按位与操作符:二进制操作符,使用规则:0+0=0、1+0=0、0+1=0、1+1=1;
所以利用这两种操作符,二进制数右移并与1按位与,结果为1则判断出二进制这一位为1。
#include<stdio.h>
int main()
{
int num = 0;
int count = 0;
scanf("%d", &num);
int i = 0;
for (i = 0; i < 32; i++)//一个整数占四个字节,每个字节等于8个bit位,所以一共32个bit位
{
if (1 == ((num >> i) & 1))//i为多少,num就向右移动多少位;--num与1按位与运算,结果为1则证明num那一位为1
count++;
}
printf("%d\n", count);
return 0;
}