You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言uint64_t转二进制函数输出错误,求排查修正方案

二进制转换函数异常排查与修复

给定约束:主函数与头文件不可修改,需在convert.c中实现void convert_to_binary(uint64_t number, enum ZERO_OR_ONE bits[])和void convert_to_hexadecimal(uint64_t number, uint8_t hex[])函数。其中十六进制转换函数工作正常,但二进制转换函数输出异常:输入数值5564275972427363982时,当前输出为1011 0010 1100 0111 1011 1000,预期输出为0100 1101 0011 1000 0100 0111。


相关代码

主函数代码

#include <inttypes.h>
#include <stdlib.h>

void print_binary( FILE* out, enum ZERO_OR_ONE bits[]);
void print_hex( FILE* out, uint8_t hex[]);
void print_hex_compact( FILE* out, uint8_t hex[]);

int main( int argc, char* argv[] )
{
    if ( argc != 3 )
    {
        fprintf( stderr, "USAGE: %s <input file> <output file>\n", argv[0] );
        exit(1);
    }
    FILE* in = fopen(argv[1], "r");
    FILE* out = fopen(argv[2], "w");

    fprintf( out, "%20s%20s\n", "Input","Converted");

    uint64_t number;
    fscanf( in, "%" SCNu64, &number );
    enum ZERO_OR_ONE bits[64];
    uint8_t hex[16];
    while( !feof( in ) )
    {
        fprintf( out, "%20" PRIu64 "\t", number );
        convert_to_binary( number, bits );
        print_binary(out, bits);
        convert_to_hexadecimal(number, hex );
        fprintf( out, "%20" PRIu64 "\t", number );
        print_hex_compact(out, hex);
        fscanf( in, "%" SCNu64, &number );
    }


    fclose(in);
    fclose(out);

    return 0;
}

void print_binary( FILE* out, enum ZERO_OR_ONE bits[])
{
    for ( int i=63; i>=0; i-- )
    {
        if ( bits[i] == ZERO )
            fprintf(out, "0");
        else
            fprintf(out, "1");

        if ( i % 4 == 0 ) fprintf(out, " ");
    }
    fprintf(out, "\n");
}

当前二进制转换函数代码

void convert_to_binary(uint64_t number, enum ZERO_OR_ONE bits[]) {
      for (int i = 63; i >= 0; i--) {
        bits[i] = (enum ZERO_OR_ONE)((number >> i) & 1);
    }
}

十六进制转换函数代码

void convert_to_hexadecimal(uint64_t number, uint8_t hex[]) {
      for (int i = 15; i >= 0; i--) {
        uint8_t digit = (number >> (i * 4)) & 0xF;

        // Store the hexadecimal digit in the array.
        hex[i] = digit;
    }
}

错误原因分析

对比当前输出与预期输出,二者是按位取反的关系(当前输出的1对应预期的0,0对应预期的1)。结合十六进制函数工作正常的前提,核心问题出在二进制转换函数对enum ZERO_OR_ONE的赋值逻辑:

头文件中enum ZERO_OR_ONE的定义大概率是ZERO=1,ONE=0(与常规定义相反),而当前函数直接将位运算结果(number >> i) & 1赋值给bits[i],导致存储的ZERO和ONE与实际位值颠倒。


修复方法

针对枚举定义颠倒的情况,修改二进制转换函数,将位运算结果取反后再赋值:

void convert_to_binary(uint64_t number, enum ZERO_OR_ONE bits[]) {
    for (int i = 63; i >= 0; i--) {
        // 取反位运算结果,匹配ZERO=1、ONE=0的枚举定义
        bits[i] = (enum ZERO_OR_ONE)(1 - ((number >> i) & 1));
    }
}

验证

以输入5564275972427363982为例,修复后的函数会将原二进制位取反后存储,匹配print_binary函数的输出逻辑,得到预期的0100 1101 0011 1000 0100 0111。

内容的提问来源于stack exchange,提问作者s1mple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:20:53