【问题标题】:Java: Count number of bits set in a java.util.BitSetJava:计算 java.util.BitSet 中设置的位数
【发布时间】:2011-06-20 11:16:25
【问题描述】:

除了通常的“保留计数器”方法之外,还有什么快速计算 BitSet 中设置位数的方法吗?

【问题讨论】:

    标签: java 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 - 显然,我在那里度过了一段糟糕的时光,无法看到最佳(和最高投票)答案......我的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多