二进制到十进制(大数)

Rom*_*ira 2 algorithm binary decimal biginteger

我正在构建一个基于大整数的 C 库。基本上,我正在寻求一种快速算法将二进制表示中的任何整数转换为十进制数

我看到了 JDK 的Biginteger.toString()实现,但对我来说它看起来很重,因为它被用来将数字转换为任何基数(它对每个数字使用一个除法,在处理数千个数字时应该很慢)。

因此,如果您有任何文档/知识可以分享,我很乐意阅读。

编辑:关于我的问题的更精确:

  • 让 P 一个内存地址

  • 令 N 为在 P 处分配(和设置)的字节数

如何将地址 P 处的 N 个字节表示的整数(让我们以小端排列使事情更简单)转换为 C 字符串

例子:

  • N = 1

  • P = 一些存储“00101010”的随机内存地址

  • 输出字符串 = "42"

还是谢谢你的回答

Ste*_*ein 6

BigInteger.toString 方法看起来很重的原因是分块进行转换。

一个简单的算法会取最后一位数字,然后将整个大整数除以基数,直到没有任何剩余。

这样做的一个问题是大整数除法非常昂贵,因此将数字细分为可以用常规整数除法处理的块(与 BigInt 除法相反):

static String toDecimal(BigInteger bigInt) {
  BigInteger chunker = new BigInteger(1000000000);
  StringBuilder sb = new StringBuilder();
  do {
    int current = bigInt.mod(chunker).getInt(0);
    bigInt = bigInt.div(chunker);
    for (int i = 0; i < 9; i ++) {
      sb.append((char) ('0' + remainder % 10));
      current /= 10;
      if (currnet == 0 && bigInt.signum() == 0) {
        break;
      }
    }
  } while (bigInt.signum() != 0);
  return sb.reverse().toString();
}
Run Code Online (Sandbox Code Playgroud)

也就是说,对于固定基数,您可能会更好地将“双重涉猎”算法移植到您的需要,如评论中所建议:https//en.wikipedia.org/wiki/Double_dabble