Java:在java.util.BitSet中计算设定位的位数

19

除了通常的“保持计数器”方法以外,是否有快速计算 BitSet 中设置位数的方法?

3个回答

44

3
如果您想知道这是如何实现的:它不会保持内部计数器,而是循环遍历用于保存位的long[],并对其中的每个元素调用Long#bitCount方法。 - Thilo
1
在底层,它使用Long.bitCount()。在现代CPU上,有一个用于此的CPU指令popcnt。在最近的Java版本中,Long.bitCount()使用了这个指令。只需使用-XX:+UsePopCountInstruction来打开它(这是最近的Java版本的默认设置)。 - Karl

3
< p >(假设您不想调用基数函数)< /p >
int count = 0; 
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
    count++;
}

查看javadoc文档


1
BitSet B1 = new BitSet(3);
B1.set(0);
B1.cardinality();

输出:

1

5
这句话的意思是:这并没有比6年前发布的那个方法所提供的答案更多的内容。 - Bernhard Barker
我不同意@Dukeling的观点。一,它使用了BitSet的API。二,这只是一个方法调用,而不是4行循环。在我看来,这是正确的答案,之前的答案是一种蛮力方法。 - vacant78
@vacant78,我指的是另一个答案,它引用了相同的方法,并提供了文档链接和简要说明其功能。 - Bernhard Barker
@Dukeling - 显然,我在那里犯了一个错误,没有看到最好的(和得票最高的)答案...是我的错。 - vacant78

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接