计算位数和字数BigInteger

时间:2016-04-16 07:51:25

标签: java android biginteger

在将String转换为BigInteger时,Java在内部计算BigInteger中的位数,然后计算单词数(每个单词是我认为的9个整数的组),可以看出从第325行到第327行的here。然后使用numWords创建一个可以容纳BigInteger.

的数组

我不理解第325行中用于计算numBits的逻辑,然后是第326行中numWords的逻辑。

逻辑上我认为对于字符串" 123456789",numWords应为1而对于" 12345678912",numWords应为2,但是&# 39;并非总是如此。例如,对于" 12345678912345678912",numWords应为3,但它应为2。

有人可以解释一下325和326行使用的逻辑吗?

3 个答案:

答案 0 :(得分:1)

要将numDigits的十进制数表示为二进制数,需要

numDigits * Math.log(10) / Math.log(2)

位。

int numBits = (int)(((numDigits * bitsPerDigit[radix]) >>> 10) + 1);

在上面的计算中bitsPerDigit[10]3402

Math.log(10) / Math.log(2) * Math.pow(2, 10) = 3401.6543691646593

答案 1 :(得分:1)

在Java中,BigIntegers不会存储为字符串或字节,每个都有一个数字。它们存储为32位整数数组,它们共同构成了BigInteger的所谓大小。可以没有前导零整数(*),因此BigInteger尽可能紧凑地存储。

"字"提到的是这些32位整数。它们不是9位数的组,它们是完整使用的,因此每个位都很重要。

所以你只需要知道存储了多少32位整数,这是内部数组的长度乘以32但是顶部整数仍然可以有前导零,所以你必须得到那个前导零的数量。顶部整数并从获得的产品中减去它们,伪代码:

numBits = internalArray.length * 32 - numberOfLeadingZeroBits(internalArray[0]);

请注意,内部数组与最低地址处的顶部整数一起存储(我不知道为什么会这样),因此顶部整数位于数组的索引0处。

(*)实际上,上面的内容有点复杂,因为顶部项目可能存储在距离数组开头的偏移处(可能使某些计算更容易),但要了解机制,你可以假装没有额外的整数。

答案 2 :(得分:0)

单词并不是指你所知道的单词 - 它指的是单词作为内存块。

https://en.wikipedia.org/wiki/Word_(computer_architecture)