31、输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
数据范围:- 2^31 <= n <= 2^31-1
即范围为:-2147483648<= n <= 2147483647
示例1
输入:
10
返回值:
2
说明:
十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。
示例2
输入:
-1
返回值:
32
说明:
负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1
思路
将得到的数字分别与1按位与运算,将得到的结果放入字符数组中,然后再将字符数组进行遍历,如果为1,则count累加,遍历完成后输出即可。
具体实现
#include <stdio.h>
#include <stdlib.h>
char *toBinary(int num)
{
char *binary = (char *)malloc(sizeof(char) * 33);
int flag = 1;
int i;
for (i = 31; i >= 0; i--)
{
if (num & flag)
{
binary[i] = '1';
}
else
{
binary[i] = '0';
}
flag << 1;
}
binary[32] = '\0';
return binary;
}
int main()
{
int n,count = 0;
char *tmp;
scanf("%d", &n);
tmp = toBinary(n);
for(int i = 0;i < 32;i++) {
if(tmp[i] == '1')
count++;
}
free(tmp);
tmp = NULL;
printf("%d", count);
return 0;
}
小结
对于数字的运算不一定非得要以数字来进行,可以以字符数组或者字符串的形式来得到想要的结果,最后输出即可。