十进制转二进制数表示逻辑错误

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

我被指示编写一个程序,将十进制数表示为 32 位二进制数。我的代码可以正常工作,编译正常,但输出不正确。我已经使用了所有资源,但似乎是一个小错误,我无法挑出它。

这是我的代码:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "binary.h"

int exponent;
int rem;
int binary_array[32];
int position;
int x;

int twos_complement(int x){}

void binary(int x, int position, int binary_array[]) {
    exponent = 31;

    for (; exponent >= 0; exponent--) {
        rem = x % (int)pow(2, exponent);
        if (rem == x) {
            binary_array[position] = 0;
            position++; 
        } else if (rem < x) {
            binary_array[position] = 1;
            position++;
            binary(rem, position, binary_array);
        }
    }
}

int main(int x) {
    x = 563;
    position = 0;
    binary(x, position, binary_array);

    for (int i = 0; i < 32; i++) {
        printf("%d", binary_array[i]); 
    }   
    printf("\n");
}

如你所见,我设置了

x = 563
。但我得到的输出
00000000000000000000001000000000
这是不正确的。它正确地识别了小于
563 % 512 = 51
563
,但它不会继续下去,并使所有剩余的位成为
0
。我的
if
陈述的逻辑是试图辨别一个数字是否大于
x
。示例:563 / 1024 = 0 R 563。只要余数等于被除数,我就推断它被比它大的数除,并且该位应该为 0。

c binary logic
1个回答
0
投票

恐怕你的方法行不通。您不应测试余数是否等于

x
(对于所有大于
x
的 2 次幂都成立),您应该使用按位与运算符 (
&
) 来测试相应位是否已设置。

我不明白为什么你让

binary
递归地调用自身,也不明白为什么你让临时变量成为全局的。

此外,

int main(int x)
不是
main
函数的有效原型。

最后,

(int)pow(2, exponent)
在第一次迭代中具有未定义的行为,因为 231 超出了 32 位有符号整数的范围。

这是修改后的版本:

#include <stdio.h>

void binary(unsigned int x, int binary_array[]) {
    for (int i = 0; i < 32; i++) {
        if (x & (1U << (31 - i)))
            binary_array[i] = 1;
        else
            binary_array[i] = 0;
    }
}

int main(void) {
    int binary_array[32];
    int x = 563;

    binary(x, binary_array);

    for (int i = 0; i < 32; i++) {
        printf("%d", binary_array[i]); 
    }   
    printf("\n");
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.