计算机是以二进制补码的形式存储,例如:13 00000000 00000000 00000000 00001101 -----原码,反码,补码
正数的原码 反码 补码 相同
-1
10000000 00000000 00000000 00000001 ----原码
11111111 11111111 11111111 11111110 -----反码(按位去反,符号位不变)
11111111 11111111 11111111 11111111 ------补码(反码+1)
负数的最高位为符号位
#include<stdio.h>
int count_one_bits_one(unsigned int n){ //无符号整形使负数的符号位变为有效数位
int i=0,count=0;
while(n){
if(n%2 == 1)
count++;
n /=2;
}
return count;
}
int main(){
int n;
printf("请输入一个数:\n");
scanf("%d",&n);
int count = count_one_bits(n);
printf("二进制中1的个数:%d\n",count);
return 0;
}
二进制中的补码每一位都按位与上一个1,就得到二进制的每一位
& ---按位与---同1才1
>>左移操作符
00000000 00000000 00000000 00001101 -----13的补码
00000000 00000000 00000000 00000001 ------1的补码
#include<stdio.h>
count_one_bits_two(int n){
int i=0,count=0;
while(i<32){
if((n>>i)&1 == 1)
count++;
i++;
}
return count;
}
int main(){
int n;
printf("请输入一个数:\n");
scanf("%d",&n);
int count = count_one_bits_two(n);
printf("二进制中1的个数:%d\n",count);
return 0;
}
13与12
00000000 00000000 00000000 00001101
00000000 00000000 00000000 00001100
一次取下一个1,循环几次就取下几个1。
int count_one_bits_three(int n){
int count=0;
while(n){
n = n&(n-1);
count++;
}
return count;
}
int main(){
int n;
printf("请输入一个数:\n");
scanf("%d",&n);
int count = count_one_bits_three(n);
printf("二进制中1的个数:%d\n",count);
return 0;
}