#includeint main() { int num = 0; int count = 0; printf("存储一个数:"); scanf("%d", &num); while (num) { if (num % 2 == 1) count++; num = num / 2; } printf("二进制中1的个数=%dn",count); return 0;
首先大家要了解一个十进制的数怎么转变为一个二进制的数;
简单来说就是一个数除2后得到一个商和一个余数,余数放在末尾,商继续除2,依次往复,知道商为0为止;
例如:7/2=3....1 然后 3/2=1....1 在1/2=0....1
因此7的二进制就是111;
所以按照上述代码可以计算出二进制中1的个数;
但是这个方法只能求得正数二进制中1的个数,因为负数在内存中的补码是和原码相反+1,所以无法求得负数的情况;
方法2:#includeint main() { int num = 0; int count = 0; int i = 0; printf("请输入你要储存的数:"); scanf("%d", &num); for (i = 0; i < 32; i++) { if (((num>>i)&1)==1) { count++; } } printf("二进制中1的个数=%dn", count); }
看这段代码前我们得先知道&和>>的用法:
就是两个数在二进制上进行比较,同为1则是1
例如:3&5=1
00000000000000000000000000000011
00000000000000000000000000000101
00000000000000000000000000000001
而>>则是把二进制往右移一位:
00000000000000000000000000000011
00000000000000000000000000000001
所以我们可以利用&和>>让要求的数和1进行比较,32次后就能求出二进制中1的个数



