在 C 中将十进制转换为二进制

问题描述 投票:0回答:1

我已经为这个问题苦苦挣扎了一段时间了。主函数和转换头文件已经给出,不允许修改,而是使用“void Convert_to_binary(uint64_t number, enum ZERO_OR_ONE bits[])”和“void Convert_to_hexadecimal(uint64_t number)创建一个convert.c函数, uint8_t 十六进制[])"。

就十六进制部分而言,我已经弄清楚了,它用“

”打印出正确的值
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;
    }
}

但是我当前的二进制代码为“

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);
    }
}

”我收到输出

1011 0010 1100 0111 1011 1000

“5564275972427363982”而不是

0100 1101 0011 1000 0100 0111

有人可以帮助我解决这个问题并解释我的代码做错了什么吗?

我多次尝试更改代码,尝试将 i 从 63 更改为 64 等,但到目前为止似乎没有任何效果。

c binary hex
1个回答
0
投票
  1. 您的位数远远不够。结果是:
    0100 1101 0011 1000 0100 0111 1000 0100 0010 0000 1100 0110 0011 0110 1000 1110
enum ZERO_OR_ONE
{
    ZERO, ONE,
};

void convert_to_binary(uint64_t number, enum ZERO_OR_ONE bits[])
{
    for(uint64_t mask = 1ULL << 63; mask; mask >>= 1)
    {
        if(number & mask) *bits = ONE;
        else *bits = ZERO;
        bits++;
    }
}

int main(void) {
    enum ZERO_OR_ONE arr[64];

    convert_to_binary(5564275972427363982ULL, arr);

    for(int x = 0; x< 64; x++) printf("%d%s", arr[x], x % 4 == 3 ? " " : "");
}

https://godbolt.org/z/89bWYcj71

© www.soinside.com 2019 - 2024. All rights reserved.