【问题标题】:How to add two BitSet如何添加两个 BitSet
【发布时间】:2012-03-30 15:14:36
【问题描述】:

我正在寻找一种添加两个 BitSet 的方法。我应该去二进制数的基础知识并在 BitSet 上执行XORAND 操作。正如这里所说的那样-

这会有效吗?

【问题讨论】:

  • @stefanbachert no.... 一点也不。实际上我正在提高我的编程技能。所以只是玩bitset

标签: java bitset


【解决方案1】:

不,它效率不高,因为在您处理了通过N-1 的所有位之前,您不会知道位N 的进位。这就是硬件中进位超前加法器解决的问题。

在最坏的情况下,无法以不涉及逐个检查所有位的方式来实现位集的添加。另一种策略在很大程度上取决于您的具体要求:如果您对位集进行了很多变异,您可能希望根据 Sun 的 Oracle 的实现推出自己的策略。您可以无耻地复制借用他们的代码,并添加一个add 的实现,该实现在BitSet 的“胆量”上运行,存储为long[] bits。您需要非常小心地处理溢出(请记住,Java 中的所有数字都是有符号的),否则应该相当简单。

【讨论】:

  • 你把效率和效果混为一谈。当你说“高效”(“它工作得很快/资源更少”)时,你的意思是“有效”(“它工作正常”)
  • @stefanbachert 我的意思是“高效”,就像“工作速度快”一样。您可以使用 OP 中的方案作为正确实现的基础,但它需要将半地址的进位标志与加法结果多次组合,直到没有新的进位标志;这可能需要N 在最坏的情况下,其中N 是两个数字中较大的位数。
  • 让我试试。如果我可以管理进位,那就最好了,否则我必须将其转换为整数/长整数。
  • @RaviJoshi 你不需要在代码中尝试,只要想一想:在一个BitSet 中设置从0 到1000 的所有位,在另一个BitSet 中设置位为零。现在将两者加在一起。您将在第 1 位中进位,在第 0 位中进位,在其余位中一直到 1000。现在应用进位,并在第 0 位和第 1 位中获得零,在第 2 位中获得进位,一直到 1000。很明显,您需要重复 1000 次才能到达末尾,这很严重效率低下。
  • @RaviJoshi 您需要自己编写添加代码。使用BitSetbits 数组,就像BigIntegersetAdd method 使用其名为words 的数组一样。请注意BigInteger 的数组是int,而不是long,因此他们更容易处理溢出。你的逻辑会涉及更多,但它是可行的。
【解决方案2】:

最有效的方法是将两个位集都转换为数字,然后将它们相加

【讨论】:

  • 如将BitSet 展开为非负数BigInteger?
  • 是的,但是,当位限于此时,我会使用 int 或 long
  • @stefanbachert:如果bitset 很大怎么办?在这种情况下如何使用 BigInteger?
  • 这是非常理论上的。最后,我们正在讨论添加两个数字。 long 有 63 位加号。自大爆炸以来,long 能够以 2ns 的步长计算。我们所说的任何东西都远非现实的实际用途
猜你喜欢
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 2020-05-14
  • 2015-12-18
相关资源
最近更新 更多