java - 算法改进 : Counting set bits in Byte-Arrays

标签 java bit-manipulation

我们将知识以位的形式存储在字节数组中。计算设置位的数量非常慢。欢迎提出任何改进算法的建议:

public static int countSetBits(byte[] array) {
    int setBits = 0;

    if (array != null) {
        for (int byteIndex = 0; byteIndex < array.length; byteIndex++) {
            for (int bitIndex = 0; bitIndex < 7; bitIndex++) {
                if (getBit(bitIndex, array[byteIndex])) {
                    setBits++;
                }
            }
        }
    }
    return setBits;
}
public static boolean getBit(int index, final byte b) {
    byte t = setBit(index, (byte) 0);
    return (b & t) > 0;
}
public static byte setBit(int index, final byte b) {
    return (byte) ((1 << index) | b);
}

计算长度为 156'564 的字节数组的位数需要 300 毫秒,这太多了!

最佳答案

尝试Integer.bitcount来获取每个字节中设置的位数。如果可以从 byte 数组切换到 int 数组,效率会更高。如果这是不可能的,您还可以为所有 256 个字节构建一个查找表来快速查找计数,而不是迭代各个位。

如果您感兴趣的始终是整个数组的计数,则可以将数组包装在一个类中,每当数组更改时,该类将计数存储在单独的整数中。 (编辑:或者,实际上,正如评论中所述,使用 java.util.BitSet。)

关于java - 算法改进 : Counting set bits in Byte-Arrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14894576/

相关文章:

python - 用于 Lucas-Lehmer 素数测试的更快的按位模数

c++ - 转换位数组以更快地设置

c - C操作:return 1 when all bits of byte i of x equal 1; 0 otherwise的一道题

javascript - 如何强制按位运算符产生无符号结果?

java - LibGDX Sprite 上的黑色细边框

java - 收到错误消息说类未与命名查询映射

java - 将字符串中的数字与枚举进行比较

java - 如何使用 apache poi 获取 pptx 幻灯片注释文本?

java - pom.xml中自动递增版本号并显示在应用程序中

javascript - 如何从十六进制字符串构建二进制数组