java BigInteger转换算法

问题描述 投票:1回答:1

来自Java的BigInteger将number存储为“无符号整数”数组(它是整数数组,但它们将信息存储在32位系统中,然后将其转换为long并进行操作)。

他们如何从十进制系统转换为基本32位系统?算法是什么?

我正在阅读消息来源,我不明白。我看到他们将数字拆分为10位数字符串(整数可以处理1_000_000_000),但下一步是什么?偏离2?或2 ^ 32(4294967296)?

感谢您帮助理解它。

java algorithm performance biginteger
1个回答
0
投票

对于非常大的数字,可能使用了一个棘手的分而治之算法,但除此之外,它就像整数一样:

  1. 将中间结果(BigInteger)设置为值BigInteger.ZERO。
  2. 阅读标志(如果有的话)并记住它
  3. 读一个数字
  4. 使用给定的数字基数(基数,2..36),将数字转换为二进制,例如在10号基地,'9'被转换为9,在16号基地,'A'被转换为10,等等。
  5. 将中间结果乘以基数并添加数字的值,因此如果base为10,则将中间结果乘以10并添加刚刚读取的9。
  6. 从第2点开始重复,直到读取整个字符串
  7. 设置标志
  8. 清理并在必要时删除前导零等。
  9. 返回中间BigInteger作为函数结果。

循环的工作方式如下:

number: 1234 (base 10)
intermediate x = 0
read digit = 1: x = x * 10 + 1 = 0 + 1 = 1
read digit = 2: x = x * 10 + 2 = 10 + 2 = 12
read digit = 3: x = x * 10 + 3 = 120 + 3 = 123
read digit = 4: x = x * 10 + 4 = 1230 + 4 = 1234

the same number in base 16:
read digit = 1: x = x * 16 + 1 = 0 + 1 = 1
read digit = 2: x = x * 16 + 2 = 16 + 2 = 18 (= 0x12)
read digit = 3: x = x * 16 + 3 = 288 + 3 = 291 (= 0x123)
read digit = 4: x = x * 16 + 4 = 4656 + 4 = 4660 (= 0x1234)
© www.soinside.com 2019 - 2024. All rights reserved.