在将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行使用的逻辑吗?
答案 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)
单词并不是指你所知道的单词 - 它指的是单词作为内存块。