【问题标题】:Java BigInteger with very large binary numbers具有非常大二进制数的 Java BigInteger
【发布时间】:2013-10-23 01:50:24
【问题描述】:

我有 2 个非常大的二进制数(144 位)。我想将它们写在不同的 RandomAccessFiles 中,然后将文件读入内存并检查哪个数字更大。 到目前为止我做了什么:

1。 我创建了一个 BigInteger:

BigInteger big = new BigInteger("01110101010010101010111100010101010101010101010110101010101010101010010101010101010101010101010101111010010101010",2);

2。 我得到了 longValue:

big.longValue();   

3.. 我将 long 写入随机访问文件,读取文件,比较 long 等...

但如果二进制文件比 'Long.maxvalue' 长,我所做的是错误的,对吗?

那么有人有什么建议吗?

否则我可以处理大的二进制数吗?

【问题讨论】:

  • 为什么不直接将大整数写入文件? BigIntegers 默认是可序列化的。检查 ObjectInputStream。您还可以检查是否只需编写与文件等效的字符串。
  • 您可以使用bit stream。理论上不应使用 long 来表示位。

标签: java binary biginteger randomaccessfile


【解决方案1】:

尝试如下比较

           BigInteger big1 = new BigInteger("01110101010010101010111100010101010101010101010110101010101010101010010101010101010101010101010101111010010101010",2);
           BigInteger big2 = new BigInteger("01110101010010101010111100010101010101010101010110101010101010101010010101010101010101010101010101111010010101010",2);
           int result =big1.compareTo(big2);
           System.out.println(result);

【讨论】:

  • 由于我使用的是 RandomAccessFile,我希望能够搜索。我对序列化了解不多,我可以将我的 BigInteger 序列化为字符串吗?我想知道文件上需要多少字节以便在我读取文件时进行查找。这就是为什么我将它转换为长(8 字节)。我想要一个文件:写 int,写 int,写大二进制,写 int,写 int,写大二进制....等然后能够读取所有值并比较二进制数。
【解决方案2】:
  1. 消除初始零

  2. 将这些数字转换为字符串

  3. if(String1.length !=String.length ) 最大数是较长的一个

否则

从一开始就一个一个地取数字并比较。

if(string1 digit x = 0 & string 2 digit x=0) 转到下一个数字

if(string1 digit x = 1 & string 2 digit x=0) 字符串 1 很大

if(string1 digit x = 0 & string 2 digit x=1) 字符串 2 很大

【讨论】:

    【解决方案3】:

    很明显,你的数字太大了。

    我建议您使用 BigInteger.getByteArray() 将 BigInteger 导出为字节数组,然后您可以将其保存到文件中(这就是我们在密码学中所做的)。

    此外,字节数组可以使用其构造函数转换回 BigInteger。

    【讨论】:

    • 非常感谢 vincent 和 upong。我应该做的是将二进制数转换为 BigInteger,使用 getByteArray() 将其写入文件,使用构造函数 BigInteger(byteArray[]) 从文件中读取它,然后使用 big1.compareTo(big2) 比较 BigInteger。我总结了其他有同样问题的人。再次感谢!
    • 不客气。如果您认为合适,请记住将此答案标记为解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 2011-07-19
    • 2012-11-25
    • 2013-07-23
    • 2012-10-26
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多