C 某些输入的整数到二进制转换程序失败
我编写了获取整数二进制形式的代码。对于1或10这样的输入,它工作得很好。然而,对于256这样的输入,它是失败的。(它给出0000000秒的输出,但未命中该输出)C 某些输入的整数到二进制转换程序失败,c,binary,integer,C,Binary,Integer,我编写了获取整数二进制形式的代码。对于1或10这样的输入,它工作得很好。然而,对于256这样的输入,它是失败的。(它给出0000000秒的输出,但未命中该输出) #包括 #包括 需要整数个二进制数字(整数n){ 返回cell(log(n))+1; } 无效打印数组(int*a,int n){ int i=0; 对于(;i使用对数函数与ceil一起计算位数将由于浮点下冲而受到影响 计算二进制位数的一种更可靠的方法是反复除以2,直到得到零。C的log函数给出的结果以e为基数,而不是2为基数。这就是为
#包括
#包括
需要整数个二进制数字(整数n){
返回cell(log(n))+1;
}
无效打印数组(int*a,int n){
int i=0;
对于(;i使用对数函数与ceil一起计算位数将由于浮点下冲而受到影响
计算二进制位数的一种更可靠的方法是反复除以2,直到得到零。C的log函数给出的结果以e为基数,而不是2为基数。这就是为什么一些数字在您的程序中会给出意外的结果,因为您使用它进行计算。我认为有一个函数正是您所需要的。桩号使用log(n),它计算n基e的对数
而是使用log2(n)
希望有帮助。:-您甚至不需要提前计算位数。您可以将num%2
中的数字写入缓冲区,直到(num/=2)==0
,然后以相反的顺序打印,或者,以相反的顺序将它们存储在缓冲区中。@WeatherVane谢谢,我正试图以正向方式进行操作。.是否正确使用了反向方式。.我正在按您键入的方式编辑:您可以以相反的顺序存储它们,而无需知道数量。从足够大的缓冲区末尾开始,然后打印t从您停止的位置创建缓冲区。如果该缓冲区位于binary[90]
,则您可以printf(“%s”,binary+90);
但是你需要一个NUL
终止符,还需要在每个数字进入缓冲区时向其添加'0'
。为什么浮点计算错误?在mat.h.中日志函数没有正确实现。有什么替换吗?你能给出一个未命中的例子吗…这里我没有得到它。你已经在你的代码中看到了一个例子!G设置调试器。自然对数函数对于很多科学应用来说已经足够好了,但是它可能会出现在第15个有效数字上,或者更糟,但是使用ceil本质上会将平滑函数转换为不连续函数,这就是所有问题的症结所在。谢谢,但是log2是一个mi桩楼(log2)作品great@RONALDO69round
可能比floor
或ceil
更好。使用日志数数数字时要非常小心。我喜欢你接受的答案,但它可能会咬你一口。也就是说,round会解决这个问题。哈。很好。即使如此,也有可能出现下冲。二进制浮点的可能性较小,但是WeatherVane:我还是不太小心。不过我会投票给这个答案。round
可能比ceil
好。@WeatherVane:确实会的。
#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]);
}