【问题标题】:Integer to Binary Conversion Program Fails for Some Inputs某些输入的整数到二进制转换程序失败
【发布时间】:2018-11-22 04:44:41
【问题描述】:

我编写了用于获取整数的二进制形式的代码。它适用于 1 或 10 之类的输入。但是,它对于 256 之类的输入却失败了。(它给出了 0000000 秒的输出并错过了那个)。

#include <stdio.h>
#include <math.h>

int number_of_binary_digits_required(int n){

return ceil(log(n))+1;

}

void print_array(int * a, int n){

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

}


int main(){

int num = 256;
int binary[100];
int n = number_of_binary_digits_required(num);
int bin_digits = n-1;

while (num){

   int temp = num%2;
   num = num / 2;
   binary[bin_digits] = temp;
   //printf("%d\n", bin_digits);
   bin_digits--;

}

print_array(binary, n);

//printf("%d", number_of_binary_digits_required(num));
//for(bin_digits = 0;bin_digits < number_of_binary_digits_required(num);bin_digits++)
//printf("%d",binary[bin_digits]);


}

为什么会出现问题以及如何解决?

谢谢!

【问题讨论】:

  • 你甚至不需要提前计算位数。您可以将来自num % 2 的数字写入缓冲区直到(num /= 2) == 0,然后以相反的顺序打印它们,或者以相反的顺序将它们存储在缓冲区中。
  • @WeatherVane 谢谢,我试图以正向方式进行操作..正确地使用反向方式进行操作..
  • 我正在编辑你输入的内容:你可以以相反的顺序存储它们而无需知道有多少。从足够大的缓冲区的末尾开始,然后从您停止的地方打印缓冲区。如果那是在binary[90],那么你可以printf("%s", binary + 90); 但是你需要一个NUL 终止符,并且在每个数字进入缓冲区时添加'0'

标签: c binary integer


【解决方案1】:

C 的 log 函数给出的结果是以 e 为底,而不是 2。这就是为什么有些数字在你的程序中会给出意想不到的结果,因为你使用它来计算。我认为有一个函数log2 这是你需要的。

【讨论】:

  • 哈。好地方。即便如此,也有下冲的可能性。二进制浮点不太可能,但仍然要非常小心。不过,我会赞成这个答案。
  • round 可能比 ceil 更好。
  • @WeatherVane:确实会。
【解决方案2】:

由于浮点下冲,您使用对数函数结合 ceil 来计算位数会受到​​影响。

一种更可靠的计算二进制位数的方法是反复除以二,直到得到零。

【讨论】:

  • 为什么浮点数计算错误?在 mat.h 中是否没有正确实现日志功能。任何替换?你能举一个低于目标的例子吗……我不明白……
  • 您已经在代码中看到了一个示例!拿出调试器。自然对数函数对于许多科学应用来说已经绰绰有余了,但它可能在第 15 位有效数字上,或者可能比这更糟,但是您对 ceil 的使用基本上将平滑函数转换为不连续函数,这就是所有见鬼去吧。
  • 谢谢,但是 log2 是一个错误..floor(log2) 很好用
  • @RONALDO69 round 可能比floorceil 更好。
  • 在使用日志计算数字时要非常小心。我喜欢你接受的答案,但它可能会咬你。也就是说,round 会解决这个问题。
【解决方案3】:

第一个错误是使用 log(n),它计算 n 基 e 的 log。

改为使用 log2(n)

希望对您有所帮助。 :-)

【讨论】:

    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 2014-03-13
    • 2015-10-25
    • 2019-05-10
    • 2021-06-19
    • 2020-03-19
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多