我被指示编写一个程序,将十进制数表示为 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。
恐怕你的方法行不通。您不应测试余数是否等于
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;
}