【发布时间】:2012-03-30 15:14:36
【问题描述】:
我正在寻找一种添加两个 BitSet 的方法。我应该去二进制数的基础知识并在 BitSet 上执行XOR 和AND 操作。正如这里所说的那样-
这会有效吗?
【问题讨论】:
-
@stefanbachert no.... 一点也不。实际上我正在提高我的编程技能。所以只是玩
bitset类
我正在寻找一种添加两个 BitSet 的方法。我应该去二进制数的基础知识并在 BitSet 上执行XOR 和AND 操作。正如这里所说的那样-
这会有效吗?
【问题讨论】:
bitset类
不,它效率不高,因为在您处理了通过N-1 的所有位之前,您不会知道位N 的进位。这就是硬件中进位超前加法器解决的问题。
在最坏的情况下,无法以不涉及逐个检查所有位的方式来实现位集的添加。另一种策略在很大程度上取决于您的具体要求:如果您对位集进行了很多变异,您可能希望根据 Sun 的 Oracle 的实现推出自己的策略。您可以无耻地复制借用他们的代码,并添加一个add 的实现,该实现在BitSet 的“胆量”上运行,存储为long[] bits。您需要非常小心地处理溢出(请记住,Java 中的所有数字都是有符号的),否则应该相当简单。
【讨论】:
N 在最坏的情况下,其中N 是两个数字中较大的位数。
BitSet 中设置从0 到1000 的所有位,在另一个BitSet 中设置位为零。现在将两者加在一起。您将在第 1 位中进位,在第 0 位中进位,在其余位中一直到 1000。现在应用进位,并在第 0 位和第 1 位中获得零,在第 2 位中获得进位,一直到 1000。很明显,您需要重复 1000 次才能到达末尾,这很严重效率低下。
BitSet 的bits 数组,就像BigInteger 的setAdd method 使用其名为words 的数组一样。请注意BigInteger 的数组是int,而不是long,因此他们更容易处理溢出。你的逻辑会涉及更多,但它是可行的。
最有效的方法是将两个位集都转换为数字,然后将它们相加
【讨论】:
BitSet 展开为非负数BigInteger?
bitset 很大怎么办?在这种情况下如何使用 BigInteger?