Java 在BigInteger中存储和检索时出现数字问题
这里的问题是,当我将大整数转换为字节数组,然后再次将同一字节数组转换为大整数时,大整数的值正在改变。但是,当我将数字“5888561920”替换为“2944280960”或“3806908688”时,没有问题,我得到的是与输出相同的数字。这里有什么问题?BigInteger或“5888561920”有问题吗 我自己编写了toInt方法:Java 在BigInteger中存储和检索时出现数字问题,java,biginteger,Java,Biginteger,这里的问题是,当我将大整数转换为字节数组,然后再次将同一字节数组转换为大整数时,大整数的值正在改变。但是,当我将数字“5888561920”替换为“2944280960”或“3806908688”时,没有问题,我得到的是与输出相同的数字。这里有什么问题?BigInteger或“5888561920”有问题吗 我自己编写了toInt方法: bx:5888561920 94 -4 83 0 big: 1593594624 publicstaticbiginger-toInt(字节[]b){
bx:5888561920
94 -4 83 0
big: 1593594624
publicstaticbiginger-toInt(字节[]b){
String st=新字符串();
对于(int k=3;k>=0;k--){
对于(int i=0;i>1);
}
}
BigInteger bi=新的BigInteger(st,2);
返回bi;
}
在toInt()中,您将连接数字的32个最低有效位(k=0..3 x i=0..7)
5888561920大于32位数字。事实上,它的二进制表示(根据Windows Calc)是10101111101111000101001100000000,长度为33位。您已截断了最重要的位
2944280960和3806908688适合32位(位33及以上无论如何都是零)
所以我想你确实需要第五个字节,毕竟:)在toInt()中,你连接的是数字的32个最低有效位(k=0..3 x I=0..7)
5888561920大于32位数字。事实上,它的二进制表示(根据Windows Calc)是10101111101111000101001100000000,长度为33位。您已截断了最重要的位
2944280960和3806908688适合32位(位33及以上无论如何都是零)
所以我想你确实需要第五个字节:)5888561920下面的4个字节是(5888561920%2^32)==1593594624
如果要存储此数字,则需要4个以上的字节。5888561920中较低的4个字节是(5888561920%2^32)=1593594624
如果要存储此数字,需要超过4个字节。我认为这是整数边界或长检查大于2^32且小于2^32的数字的问题。我认为这是整数边界或长检查大于2^32且小于2^32的数字的问题
bx:5888561920
94 -4 83 0
big: 1593594624
public static BigInteger toInt(byte[] b){
String st=new String();
for(int k=3;k>=0;k--){
for(int i=0;i<8;i++)
{
if ((b[k] & 0x01) == 1)
{
st="1"+st;
}
else
{
st="0"+st;
}
b[k]= (byte) (b[k] >> 1);
}
}
BigInteger bi=new BigInteger(st,2);
return bi;
}