java双整数转换算法

java双整数转换算法,java,algorithm,performance,biginteger,Java,Algorithm,Performance,Biginteger,Java中的BigInteger将数字存储为无符号整数数组,它是整数数组,但它们将信息存储在32位系统中,然后将其转换为long和make操作 它们如何从十进制系统转换为32位基本系统?算法是什么 我在读资料,我不明白。我看到他们把数字拆分成10位数的字符串整数可以处理1_000_000_000,但是接下来呢? 偏离2?还是2^324294967296 感谢您帮助理解它。对于非常大的数字,可能使用了一种复杂的分治算法,但除此之外,它的实现方式与整数类似: 将中间结果a BigInteger设置为

Java中的BigInteger将数字存储为无符号整数数组,它是整数数组,但它们将信息存储在32位系统中,然后将其转换为long和make操作

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

我在读资料,我不明白。我看到他们把数字拆分成10位数的字符串整数可以处理1_000_000_000,但是接下来呢? 偏离2?还是2^324294967296


感谢您帮助理解它。

对于非常大的数字,可能使用了一种复杂的分治算法,但除此之外,它的实现方式与整数类似:

将中间结果a BigInteger设置为值BigInteger.ZERO。 如果有任何标志,请阅读并记住 读一个数字 使用给定的数字基数2..36,将数字转换为二进制,例如,在基数10中,“9”转换为9,在基数16中,“A”转换为10,等等。 将中间结果乘以基数,然后将数字的值相加,因此,如果基数为10,则将中间结果乘以10,然后将刚刚读取的9相加。 从第2点开始重复,直到读取整个字符串 设置标志 清理,如有必要,清除前导零等。 返回中间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)

对于非常大的数字,可能会使用一种复杂的分治算法,但除此之外,它与整数一样:

将中间结果a BigInteger设置为值BigInteger.ZERO。 如果有任何标志,请阅读并记住 读一个数字 使用给定的数字基数2..36,将数字转换为二进制,例如,在基数10中,“9”转换为9,在基数16中,“A”转换为10,等等。 将中间结果乘以基数,然后将数字的值相加,因此,如果基数为10,则将中间结果乘以10,然后将刚刚读取的9相加。 从第2点开始重复,直到读取整个字符串 设置标志 清理,如有必要,清除前导零等。 返回中间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)

为了正确起见,Java将BigInteger存储为int数组,Java没有无符号int

您有一个数字值,并且可以将其存储在任意基数中:以2为基数的二进制、以10为基数的十进制、以16为基数的十六进制或以100为基数。Java称之为基数

在任何基础上,该值都保持不变。例如,12decimal=1100binary=CHex=CBase 100。 为了高效存储,Java应该选择一个非常大的基础:

接近int max值如果小于该值太多,将浪费内存。应该考虑int的几乎所有位 在不溢出的情况下,使用int轻松添加该基数的数字应小于或等于2^31的一半 这就是为什么他们选择10^9的基数来存储它

Java actuall使用一种通用算法来转换除十进制转换以外的任何基数,该算法涉及到计算给定基数每整数的位数。但为简单起见,我采用十进制算法,该算法为:

 int mag[];
 BigInteger(String decimalDigits){
    mag= new int[size of array enough to store value];
    cut decimalDigits into chunks of 9 digits (the first chunk may have less than 9 digits)
    parse that chunks into integer and save into mag array (in big endian order) 
 }

为了正确起见,Java将BigInteger存储为int数组,Java没有无符号int

您有一个数字值,并且可以将其存储在任意基数中:以2为基数的二进制、以10为基数的十进制、以16为基数的十六进制或以100为基数。Java称之为基数

在任何基础上,该值都保持不变。例如,12decimal=1100binary=CHex=CBase 100。 为了高效存储,Java应该选择一个非常大的基础:

接近int max值如果小于该值太多,将浪费内存。应该考虑int的几乎所有位 在不溢出的情况下,使用int轻松添加该基数的数字应小于或等于2^31的一半 这就是为什么他们选择10^9的基数来存储它

Java actuall使用一种通用算法来转换除十进制转换以外的任何基数,该算法涉及到计算给定基数每整数的位数。但为简单起见,我采用十进制算法,该算法为:

 int mag[];
 BigInteger(String decimalDigits){
    mag= new int[size of array enough to store value];
    cut decimalDigits into chunks of 9 digits (the first chunk may have less than 9 digits)
    parse that chunks into integer and save into mag array (in big endian order) 
 }

谁说他们把这些信息存储在32位?从十进制转换为32位?你是在问如何把10位的基数转换成2位的二进制数吗?还是关于浮点表示?问题是你问的有点不清楚我问的是如何将字符串转换成biginger内部表示基32位biginger或任何地方都没有基32位。内部数字由位表示,如果需要,BigInteger只使用一个int数组向数字中添加更多的位。我同意有一个表示位的整数数组,但后来它们对长整型整数进行运算,所以它们使用基32位系统。不管怎样,他们是如何将字符串转换成这个大的位数组的???谁说他们将这些信息存储在32位?从十进制转换成32位的?你是在问如何将一个以10为基数的数字转换成以2为基数的二进制数吗?还是关于浮点表示?这个问题有点不清楚你们在问什么
我在问字符串如何转换为BigInteger内部表示基32位BigInteger或任何地方都没有基32位。内部数字由位表示,如果需要,BigInteger只使用一个int数组向数字中添加更多的位。我同意有一个表示位的整数数组,但后来它们对长整型整数进行运算,所以它们使用基32位系统。不管怎样,他们如何将字符串转换成这个大的位数组???每个人都称它为“基数”。这个答案和另一个答案都不能解决多精度转换的问题。它不像这里描述的那么简单。@user207421:你真的读过这个问题吗?昆西要求算法将十进制数转换成整数,每个人都称之为“基数”。这个答案和另一个答案都不能解决多精度转换的问题。它不像这里描述的那么简单。@user207421:你真的读过这个问题吗?昆西要求算法将十进制数转换为整数。这个答案和另一个答案都不能解决多精度转换的问题。这并不像这里所说的那么简单。无论是这个答案还是另一个答案都不能解决多精度转换的问题。它不像这里描述的那么简单。