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 中设置的位数的主要内容,如果未能解决你的问题,请参考以下文章

java.util.BitSet 详细分析 学习笔记

Java中BitSet使用(转)

位集合类BitSet

java.util有那些工具类

java 处理字符串的工具类都有哪些

BitSet 与整数/长整数