编写一个C程序,计算无符号整数值(4字节)二进制表示形式中的1数

编写一个C程序,计算无符号整数值(4字节)二进制表示形式中的1数,c,binary,C,Binary,我正在尝试编写一个C程序,它将计算用户选择和输入的整数的任何二进制表示中的所有1数。然后我要打印1的总数。但首先,我必须检查以确保输入的数字是整数。我的代码: #include <stdio.h> int main() { int num; int count; float input; printf("Please enter an integer: "); scanf("%f", &input); num = (int

我正在尝试编写一个C程序,它将计算用户选择和输入的整数的任何二进制表示中的所有1数。然后我要打印1的总数。但首先,我必须检查以确保输入的数字是整数。我的代码:

#include <stdio.h>

int main() {
    int num;
    int count;
    float input;

    printf("Please enter an integer: ");
    scanf("%f", &input);

    num = (int)input;
    if (num == input) {
        while (num > 0) {
            count += num & 1;
            num >>= 1;
            printf("%d", &count);
        }
    } else {
        printf("Warning: this is not a valid integer.");
    }
    return 0;
}
#包括
int main(){
int-num;
整数计数;
浮点输入;
printf(“请输入一个整数:”);
scanf(“%f”,&input);
num=(int)输入;
if(num==输入){
while(num>0){
计数+=num&1;
num>>=1;
printf(“%d”、&count);
}
}否则{
printf(“警告:这不是一个有效的整数。”);
}
返回0;
}

当我运行代码时,我可以输入我选择的整数,但是我得到的输出是:
1341488020134148802013414880201341488020
,或者类似的东西。我最近才开始用C编码,所以我不确定这是什么意思,也不确定我的代码哪里出了问题。

您的
count
变量没有初始化,因此它可以从random1的任何值开始。始终初始化变量:

int count = 0;
然后,当你打印它时,你打印了错误的东西-一个指向计数的指针,而不是计数本身,并且没有回车符,所以你可以在一行中获得所有信息:如果数字正确,你会得到一个“12345”或“11122234445”的单次问题

我强烈建议您打开编译器中的所有警告-这会警告您一个未初始化的变量,并且几乎可以肯定%d与输入到它的变量之间的差异(您丢失的事实可能也包括
printf



1反常的是,在某些受控开发环境中,内存归零,您将看不到任何bug。然后你就可以开始制作了。该程序将在性能优化的环境中运行,在这种环境中,内存归零不值得费心。在那里,该计划将开始不断失败。因为您刚刚开始,所以不想养成坏习惯。

代码中存在问题:

  • 您不应将数字读取为
    浮点数
    ,因为对于大于23位的数字,您会失去精度
  • 计数
    未初始化。即使只是增加它也有未定义的行为
  • 您应该使用
    printf(“%d\n”,count)打印位数。您当前使用此类型的无效转换说明符打印
    count
    地址
以下是更正的版本:

#include <stdio.h>

int main(void) {
    unsigned int num;

    printf("Please enter an integer: ");
    if (scanf("%u", &num) == 1) {
        int count = 0;
        while (num > 0) {
            count += num & 1;
            num >>= 1;
        }
        printf("%d\n", count);
    } else {
        printf("Warning: this is not a valid integer\n");
    }
    return 0;
}
#包括
内部主(空){
无符号整数;
printf(“请输入一个整数:”);
如果(scanf(“%u”,&num)==1){
整数计数=0;
while(num>0){
计数+=num&1;
num>>=1;
}
printf(“%d\n”,计数);
}否则{
printf(“警告:这不是有效的整数\n”);
}
返回0;
}
注:

  • 在当前系统上,该程序仅限于
    UINT_MAX
    以下的数字,通常为
    4294967295
    。较大的数字将以实现定义的方式处理
  • 有更复杂的方法来计算整数中1位的数量。您可以在此处了解这些信息:

建议使用
无符号u;scanf(“%u”、&u)
然后在
u
int count;中对
1
s进行计数。。。printf(“%d”、&count)应生成编译器警告。节省时间,而不是在SO上发布。启用所有编译器警告,查看代码试图打印“代码>计数<代码>地址,而不是代码< >计数< /COD>的值。@ FraveCyc代码中的C++是什么?<代码> %F 绝对是错误的。使用
%u
作为@chuxsaid@axiac对不起,我弄糊涂了。我本来应该纠正另一条线索的。放回去,你说得对,我忽略了我的计数。我还认为我的打印语句应该在while循环之外。谢谢一个简单的问题:我认为十进制数字不应该被接受,但是当我用像7.6这样的十进制数字测试代码时,我会收到一个输出,而不是我的自定义警告。这是为什么?如果你想提到“更复杂的方法”,那么值得一提的是,所有现代处理器/编译器都有一些
popcnt()
的味道,这不可避免地比我们能想到的任何其他技巧都要少。查看@GarrettMcClure:
7.6
scanf(“%u”
解析为整数
7
,后跟输入流中留下的其他字符(
.6
)。使用
scanf()
执行精确的输入验证。@CostantinoGrana:这一点很好。我听说一些复杂的C编译器实际上检测到幼稚的位计数算法,并使用
popcnt
或等效的操作码生成最佳代码。这将是最佳的优化方法,因为它有利于源代码级别的简单性和可移植性.
#include <stdio.h>

int main(void) {
    unsigned int num;

    printf("Please enter an integer: ");
    if (scanf("%u", &num) == 1) {
        int count = 0;
        while (num > 0) {
            count += num & 1;
            num >>= 1;
        }
        printf("%d\n", count);
    } else {
        printf("Warning: this is not a valid integer\n");
    }
    return 0;
}