存储在BigInteger中并返回时的数字问题

时间:2011-08-05 05:41:53

标签: java biginteger

BigInteger bx=new BigInteger("5888561920");

System.out.println("bx:"+bx);

byte x[]=new byte[5];

x=bx.toByteArray();

for(k=4;cnt<4;k--)
{

    cnt++;

    t[k-1]=x[k];
}

for(i=0;i<4;i++)

        System.out.print(" "+t[i]);

System.out.println("\nbig: "+toInt(t));

上述代码的输出是:

bx:5888561920

 94 -4 83 0

big: 1593594624

这里的问题是当我将一个大整数转换为一个字节数组并再次将同一个字节数组转换为一个大整数时,大整数的值正在发生变化。但是当我用“2944280960”或“3806908688”替换数字“5888561920”时,没有问题我得到的数字与输出相同。这里有什么问题?是BigInteger的问题还是“5888561920”

我自己编写了toInt方法:

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;
}

2 个答案:

答案 0 :(得分:2)

在toInt()中,你要连接数字的32个最低有效位(k = 0..3 x i = 0..7)。

5888561920大于32位数字。事实上,它的二进制表示(根据Windows Calc)是101011110111111000101001100000000,它是33位长。你已经截断了最重要的一点。

2944280960和3806908688符合32位(33位及以上位置都是零)。

所以我猜你确实需要第五个字节,毕竟:)

答案 1 :(得分:1)

5888561920的低4字节是(5888561920%2 ^ 32)== 1593594624

如果您想存储此号码,则需要超过4个字节。