java.util.BitSet - set()无法按预期工作

den*_*kin 7 java bit-manipulation bitset

我错过了一些痛苦明显的东西吗?或者世界上没有人真正使用java.util.BitSet?

以下测试失败:

@Test
public void testBitSet() throws Exception {
    BitSet b = new BitSet();
    b.set(0, true);
    b.set(1, false);
    assertEquals(2, b.length());
}
Run Code Online (Sandbox Code Playgroud)

我真的不清楚为什么我最终没有得到长度为2且值为10的BitSet.我偷看了java.util.BitSet的源代码,并且在随意检查时似乎无法在一点点之间做出充分的区分这已被设置为false并且有点从未设置为任何值...

(请注意,在构造函数中显式设置BitSet的大小无效,例如:

BitSet b = new BitSet(2);
Run Code Online (Sandbox Code Playgroud)

ZZ *_*der 9

您的最高位设置(如"设置为1")是位0.因此长度应为1.

请参阅JavaDoc的长度:

public int length()

返回此BitSet的"逻辑大小":BitSet中最高设置位的索引加1.如果BitSet不包含设置位,则返回零.

也许你正在寻找大小虽然如果在某个分辨率(例如16位边界)分配位,可能会高于 2?


Dan*_*tin 6

人们确实使用BitSet; 但是,他们将它用于你想要的东西以外的东西.它可能最好被认为BitSet是一种非常紧凑,记忆效率高的形式Set<Integer>,具有独特的属性,你不能把负数放入其中.

BitSets的模式中使用它们是很常见的

for (int id = set.nextSetBit(0); id >= 0; id = set.nextSetBit(id + 1)) {
  // do stuff to a set index
}
Run Code Online (Sandbox Code Playgroud)

在你做了一些事情来填补它们之后.这相当于迭代了元素Set.