当前位置: 首页 > 知识库问答 >
问题:

如何在C语言中将非常大的二进制转换成十进制

田巴英
2023-03-14

我使用netBean编写C代码,我的任务是将一个非常大的二进制数转换为十进制数(二进制数可能高达100位),我非常困惑,因为我的程序在二进制数大约为50-60位时工作,但当输入较大时,它会在运行时自动崩溃。我正在使用long int来存储十进制结果,但它似乎不起作用!这是我的密码:

 long long int decimal = 0;
    int position = 0;
    for(int i = strlen(binaryInput)-1; i>=0; --i){
        if(binaryInput[i]=='1'){
            decimal += (long long int)(pow(2,position));
        }
        ++position;
    }
    printf("\nDecimal number is: %lli ", decimal);

BinaryInput是我的字符串,从键盘存储binaryNumber。

共有3个答案

洪宇定
2023-03-14

不确定这是否是最优化的技术。这最多可以计算1000位数。你可以增加数组分配来计算更长的二进制数,我用字符串进行输入,用高中数学技术进行加法,计算2的幂

#include <bits/stdc++++.h>
typedef long long int lli;
using namespace std;

int main() {

    char bin_number[1010];
    //variable for big integer operation 
    int int_number[1010], t_int_number[500];
    /*
     * int_number : converted decimal number will be stored here
     * t_int_number : will be used to calculate the power of 2
     */


    int bin_length, t_int_length, int_length, index;
    /*
     * bin_length   : length(bin_number)
     * t_int_length : length(t_int_length)
     * int_length   : length(int_length)
     */

    bool carry;

    while(scanf("%s", bin_number) != EOF) {                     //input binary number
        for (int i = 0; i < 500; i++) {                         //intialize decimal number to 0 and t_int_number to 0
            int_number[i] = 0;
            t_int_number[i] = 0;
        }

        //set t_int_number to 1 
        t_int_number[0] = 1;
        t_int_length = 1;
        //set the int_number to 0
        int_length = 1;
        index = 0;
        //calculate input length
        bin_length = strlen(bin_number);

        for (int i = bin_length - 1; i >= 0; i--) {                  //checks each digit of binary number
            //if the digit in binary representation is 1
            if (bin_number[i] == '1') {   
                //sum (int_number, t_int_number)
                for (int index = 0; index < t_int_length; index++) {
                    int_number[index] +=
                        t_int_number[index];                //sum t_int_number digits
                    if (int_number[index] > 9) {                //if carry
                        int_number[index + 1] ++;
                        int_number[index] -= 10;
                    }
                }
                int_length = index;
                if (int_number[index] != 0) {               //i f length increase for addition 
                    int_length ++;
                }
            }

            //Being ready for next iteration
            //multiplying everytime with 2 and save it to t_int_number
            carry = false;
            for (index = 0; index < t_int_length; index++) {
                t_int_number[index] += t_int_number[index];     //double the number
            }
            for (index = 0; index < t_int_length; index++) {
                if (t_int_number[index] > 9) {
                    t_int_number[index] -= 10;
                    t_int_number[index + 1]++;
                }
            }
            if (t_int_number[index] != 0) {
                t_int_length++;
            }
        }

        //printing the decimal number
        for (int i = int_length - 1; i >=0; i--) {
            printf("%d", int_number[i]);
        }
        printf("\n");
    }

    return 0;
}
唐默
2023-03-14

long long int具有-9,223,372,036,854,775,8079,223,372,036,854,775,807的范围,如这里所述。100位不可能放进去。然而,这种类型是有符号的,你可以尝试使用无符号的,但是我没有看到任何关于你的数字是非负的假设。

您可以尝试使用适合128位带符号的int128\u t,但这不是标准配置(为什么没有int128\u t?)。

考虑使用一个大小为100的数组,其中每个单元将存储一个数字。对于这种方法,建议使用双涉猎算法,该算法用于将二进制数转换为二进制编码十进制(BCD)表示法。

如果您需要一个库,那么GNU多精度算术库就可以做到这一点。

PS:使用位移位而不是pow(),因为它将对浮点值进行操作,并会降低代码的性能。

夹谷和裕
2023-03-14

这里有一个提示:

最简单的解决方案是实际获取长二进制数,并将其分成两半(或四分之一,或其他任何形式)

跟踪其中哪一个是二进制数的上限,哪一个是二进制数的下端。

计算下限和上限的真实值。然后把它们加在一起。

 类似资料:
  • 问题内容: 我正在寻找一种简单的方法来在Swift中将二进制数转换为十进制数。例如,二进制的“ 10”变为十进制的“ 2”。 谢谢, 问题答案: 更新 为 斯威夫特2: 所有整数类型有 现在的方法,该方法根据给定的基数将字符串转换为整数: (先前的答案:) 您可以简单地使用BSD库函数,该函数根据给定的基数将字符串转换为数字:

  • 在你学习计算机的过程中,你可能已经接触了二进制。二进制在计算机科学中是很重要的,因为存储在计算机内的所有值都是以 0 和 1 存储的。如果没有能力在二进制数和普通字符串之间转换,我们与计算机之间的交互非常棘手。 整数值是常见的数据项。他们一直用于计算机程序和计算。我们在数学课上学习它们,当然最后用十进制或者基数 10 来表示它们。十进制 $$233_{10}$$ 以及对应的二进制表示 $$1110

  • 我正试图编写一个程序,将二进制数字转换成相应的十进制值。虽然错误报告有效,但我似乎在这里得到了与输出相同的二进制数。fIdx是一种正向扫描仪,不进行任何计算。请帮忙!

  • 问题内容: 如何在Swift中将Int转换为UInt8?例。我想将数字22转换为0b00010110 问题答案: 您可以使用带有参数的初始化程序将十进制值转换为人类可读的二进制 表示形式 : 如果您愿意,也可以很容易地用任意数量的零填充它: 斯威夫特5

  • 问题内容: 我正在尝试编写将数字转换为二进制的代码,这就是我写的。它给了我一些我不理解的Eclipse错误。怎么了 还有其他建议吗?我想学习并听取任何修复建议。谢谢。 错误消息: 类型中的方法不适用于参数() 这行有多个标记 令牌“ ”的语法错误,;; 预期 令牌“ ”的语法错误,;; 预期 是变量的无效类型 这行有多个标记 令牌“ mod”的语法错误,无效的AssignmentOperator

  • 将二进制补码转换为十进制最简单的方法是什么?例如,如果我通常将“1001”之类的字符串转换为十进制,则得到9。但我实际上想得到一个简单的-7。你们有什么建议?,

  • 问题内容: 如何在JavaScript中将十进制值转换为等效的十六进制值? 问题答案: 使用以下命令将数字转换为十六进制字符串: 并通过以下步骤逆向处理:

  • 问题内容: 我有一些Perl代码,其中hex()函数将十六进制数据转换为十进制。如何在Python上执行此操作? 问题答案: 如果用“十六进制数据”表示字符串形式 您可以使用 将其转换为整数并 将其转换为十进制字符串。