Java:计算 java.util.BitSet 中设置的位数
Posted
技术标签:
【中文标题】Java:计算 java.util.BitSet 中设置的位数【英文标题】:Java: Count number of bits set in a java.util.BitSet 【发布时间】:2011-06-20 11:16:25 【问题描述】:除了通常的“保留计数器”方法之外,还有什么快速计算 BitSet 中设置位数的方法吗?
【问题讨论】:
【参考方案1】:cardinality() 方法返回设置的位数。
【讨论】:
如果您想知道这是如何实现的:它不保留内部计数器,而是遍历用于保存位的long[]
,并为每个位调用Long#bitCount
。
在幕后使用 Long.bitCount()。在现代 CPU 上有一个 CPU 指令,popcnt。在最新版本的 Java 中,Long.bitCount() 使用此指令。只需使用 -XX:+UsePopCountInstruction 将其打开(这是 Java 最新版本中的默认设置)【参考方案2】:
(假设你不想调用 cardinality())
int count = 0;
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1))
count++;
see javadoc
【讨论】:
【参考方案3】:BitSet B1 = new BitSet(3);
B1.set(0);
B1.cardinality();
输出:
1
【讨论】:
除了引用 6 年前发布的这种方法的答案之外,这并没有真正增加太多。 我不同意@Dukeling。一 - 它使用 BitSet 的 API。二 - 这是一个方法调用,而不是带有循环的 4 行。这是 IMO 的正确答案,以前的答案是蛮力方法。 @vacant78 我指的是the other answer,它引用了相同的方法,并带有指向文档的链接和对其作用的简要说明。 @Dukeling - 显然,我在那里度过了一段糟糕的时光,无法看到最佳(和最高投票)答案......我的错误。以上是关于Java:计算 java.util.BitSet 中设置的位数的主要内容,如果未能解决你的问题,请参考以下文章