在 Java 中有效地迭代大量位数组中的未设置值
efficiently iterate over the not set values in a massive bit array in Java
我得到了一个保存为字节数组的大量位数组,它代表所有带符号的 int 值 (4,294,967,295)。
byte[] bitArray = byte[536870912];
数组中的每个字节代表8个数字,一个位一个。这意味着byte[0]存储1、2、3、4、5、6、7、8,byte[1]存储9、10、11、12、13、14、15、16等
我用它来存储一个巨大的 table,我可以在其中将数字设置为 true 或 false(0 或 1)。我有一些相当有效的方法来检查是否设置了一个位并设置了一个位(仅使用按位运算符)。
现在我需要一遍又一遍地迭代这个 table 来找到设置为 0 的位。当然,只存储我想迭代的数字会更有效,所以我不每次都需要检查它们,但是数字太多,将它们存储在 ArrayList 中会占用大量内存。
如何有效地多次迭代位数组中未设置的值?
How can I efficiently iterate over this bit array?
一种方法是使用 BitSet。这将同时扫描 long[]
一次检查 64 位,但它的底层方法被转换为内部函数。即单个机器代码指令可能比您在 Java.
中编写的任何内容都快
如果你真的想自己写这个,我建议你看看 BitSet 是如何工作的并复制它的代码。 (或使用 BitSet)
建议你看看Long的方法numberOfLeadingZeros(long) numberOfTrailingZeros(long) bitCount(long)
内在函数是 JVM "recognizes" 的一种方法,并用专门的机器代码指令替换这可以使它比复制代码和 运行 [=28] 中的相同代码快得多=].
How can I efficiently iterate multiple times over the not set values in the bit array?
在 BitSet 中它使用以下循环
public int nextSetBit(int fromIndex) {
if (fromIndex < 0)
throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex);
checkInvariants();
int u = wordIndex(fromIndex);
if (u >= wordsInUse)
return -1;
long word = words[u] & (WORD_MASK << fromIndex);
while (true) {
if (word != 0)
return (u * BITS_PER_WORD) + Long.numberOfTrailingZeros(word);
if (++u == wordsInUse)
return -1;
word = words[u];
}
}
注意:这是在每次迭代中检查 64 位。
我得到了一个保存为字节数组的大量位数组,它代表所有带符号的 int 值 (4,294,967,295)。
byte[] bitArray = byte[536870912];
数组中的每个字节代表8个数字,一个位一个。这意味着byte[0]存储1、2、3、4、5、6、7、8,byte[1]存储9、10、11、12、13、14、15、16等
我用它来存储一个巨大的 table,我可以在其中将数字设置为 true 或 false(0 或 1)。我有一些相当有效的方法来检查是否设置了一个位并设置了一个位(仅使用按位运算符)。
现在我需要一遍又一遍地迭代这个 table 来找到设置为 0 的位。当然,只存储我想迭代的数字会更有效,所以我不每次都需要检查它们,但是数字太多,将它们存储在 ArrayList 中会占用大量内存。
如何有效地多次迭代位数组中未设置的值?
How can I efficiently iterate over this bit array?
一种方法是使用 BitSet。这将同时扫描 long[]
一次检查 64 位,但它的底层方法被转换为内部函数。即单个机器代码指令可能比您在 Java.
如果你真的想自己写这个,我建议你看看 BitSet 是如何工作的并复制它的代码。 (或使用 BitSet)
建议你看看Long的方法numberOfLeadingZeros(long) numberOfTrailingZeros(long) bitCount(long)
内在函数是 JVM "recognizes" 的一种方法,并用专门的机器代码指令替换这可以使它比复制代码和 运行 [=28] 中的相同代码快得多=].
How can I efficiently iterate multiple times over the not set values in the bit array?
在 BitSet 中它使用以下循环
public int nextSetBit(int fromIndex) {
if (fromIndex < 0)
throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex);
checkInvariants();
int u = wordIndex(fromIndex);
if (u >= wordsInUse)
return -1;
long word = words[u] & (WORD_MASK << fromIndex);
while (true) {
if (word != 0)
return (u * BITS_PER_WORD) + Long.numberOfTrailingZeros(word);
if (++u == wordsInUse)
return -1;
word = words[u];
}
}
注意:这是在每次迭代中检查 64 位。