我写了一段代码,考虑到输入是正确的二进制数,该代码应该计算从用户那里得到的二进制数中有多少活动位(1(。
每次代码应该在main((中运行scanf((时,它都会被卡住,它不会停止运行,它只是感觉自己在思考,不会给出任何错误
这是我写的代码,在这种情况下打印";请输入二进制数:";然后它就会被卡住
#include <stdio.h>
void count_bits(long int UserNum){
int cnt=0;
while(UserNum>0)
{
if (UserNum%10==1)
{
cnt++;
}
}
printf("there are %d active bitsn",cnt);
}
int main(){
long int UserNum=0;
printf("Please enter a binaric number: ");
scanf("%ld" , &UserNum);
count_bits(UserNum);
return 1;
}
如果我先这样写scanf((,它甚至不会打印:
scanf("%ld" , &UserNum);
printf("Please enter a binaric number: ");
我在这里做错了什么?
编辑:示例输入:1101100
输出:有4个有效位
输入:0110100111
输出:有6个有效位
基本上计算中有多少个
我假设您希望将用户输入的十进制数解释为二进制数。您的代码不会检查您的输入是否遵循此约定。如果输入的数字包含0或1以外的数字,则每个不是1的数字都将被解释为0。(UserNum%10==1
(
由于这个假设,我不讨论通常必须用UserNum % 2
或UserNum & 1
测试比特的事实。(如果你想知道如何输入或打印二进制数字而不是十进制数字,请单独问一个问题。(
请注意,如果您输入的数字位数过多,您可能很容易遇到超长问题。
主要问题:函数count_bits
中有一个无休止的循环,因为您没有更新UserNum
。
你可以这样更改:
void count_bits(long int UserNum){
int cnt=0;
while(UserNum>0)
{
if (UserNum%10==1)
{
cnt++;
}
UserNum /= 10;
}
printf("there are %d active bitsn",cnt);
}
有了这个更改,代码就如预期的那样为我工作了。
Please enter a binaric number: 0110100111
there are 6 active bits
一个数字太大的例子。(我添加了一行printf("You entered %ldn", UserNum);
。(
Please enter a binaric number: 10110111011110111110
You entered 9223372036854775807
there are 0 active bits
如果在main
中交换printf
和scanf
(与count_bits
中的无休止循环(;请输入二进制数:";未打印,因为它不包含换行符,并且默认情况下输出为行缓冲。显然scanf
导致刷新输出。
如果您将其更改为打印类似的尾随换行符
printf("Please enter a binaric number:n");
它应该在进入CCD_ 12之前打印出来(使用循环(。
正如在多个注释中指出的,UserNum>0
始终为真,因此循环从未停止。
但无论如何,count_bits
函数都是错误的。对比特进行模10运算是毫无意义的。
你想要这个:
void count_bits(long int UserNum) {
int cnt = 0;
while (UserNum > 0)
{
if (UserNum % 2) // if UserNum is odd, then bit no. 0 is 1
cnt++;
UserNum = UserNum / 2; // division by 2 shifts bits to the right
}
printf("there are %d active bitsn", cnt);
}
当我们在比特级别上工作时,使用比特移位和比特掩码操作会更习惯:
void count_bits(long int UserNum) {
int cnt = 0;
while (UserNum > 0)
{
if (UserNum & 1) // mask all bits but bit no. 0
cnt++;
UserNum = UserNum >> 1; // shift bits to the right
}
printf("there are %d active bitsn", cnt);
}
尽管如此,仍有改进的空间。尤其是负数不能正常工作(不过我没有测试,你自己看看(。
有更复杂的比特计数方法,如这里所述:如何计算32位整数中的设置比特数?