int my_sz(int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n /= 2;
}
return count;
}
int main()
{
int num = 0;
scanf("%d", &num);
int ret = my_sz(num);
printf("%d\n", ret);
return 0;
}
当运行时可发现,变量num不可以是负数。如当num = -1,-1%2=-1,!=1,count不变,-1/2=0,0为假,跳过while循环,返回return。
解决方法
方法一(将整形int改成无符号整形unsigned int)
int my_sz(unsigned int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n /= 2;
}
return count;
}
int main()
{
int num = 0;
scanf("%d", &num);
int ret = my_sz(num);
printf("%d\n", ret);
return 0;
}
方法二(按(二进制)位与& 相同取同,相异取0)
int my_sz(int n)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
{
count++;
}
}
return count;
}
int main()
{
int num = 0;
scanf("%d", &num);
int ret = my_sz(num);
printf("%d\n", ret);
return 0;
}
方法三
int my_sz(int n)
{
int count = 0;
int i = 0;
while (n)
{
n = n & (n - 1); //例如n=15 01111 n
count++; // 01110 n-1
} // 01101 n
return count; // 01100 n-1
} //亦可看出,每进行一次n = n & (n - 1),都会少一个1
int main()
{
int num = 0;
scanf("%d", &num);
int ret = my_sz(num);
printf("%d\n", ret);
return 0;
}