我想将某些索引存储在位序列中。位数是 2 的幂,
可以安全地假设最大索引为 255(起始索引为 0)。早些时候我将每个索引存储为一个整数。但这占用了太多的内存。
我想用面具之类的东西。
例如:如果我想存储索引 0、3、5,那么我将 101001 即 41 存储为整数。
问题是我拥有的最大索引是 255 并且使用上述技术我只能将索引存储到 64(使用 64 位整数)。我还有其他方法可以做到这一点吗?
谢谢 :-)
我想将某些索引存储在位序列中。位数是 2 的幂,
可以安全地假设最大索引为 255(起始索引为 0)。早些时候我将每个索引存储为一个整数。但这占用了太多的内存。
我想用面具之类的东西。
例如:如果我想存储索引 0、3、5,那么我将 101001 即 41 存储为整数。
问题是我拥有的最大索引是 255 并且使用上述技术我只能将索引存储到 64(使用 64 位整数)。我还有其他方法可以做到这一点吗?
谢谢 :-)
.NET 有一个用于此类事情的内置类:BitArray
这将让您有效地存储一串位(以布尔的形式)。
您可以使用、、和方法对BitArray
s执行按位运算。And
Or
Xor
Not
BitArray
您可以使用布尔值、字节或整数来初始化 a 。例如,您可以00101100
像这样初始化它:
BitArray bits = new BitArray(new byte[] { 0x2C }); // 0x2C == 00101100
在java中,位索引变得容易,如下面的小教程......
这个类实现了一个根据需要增长的位向量。位集的每个组件都有一个布尔值。BitSet 的位由非负整数索引。可以检查、设置或清除各个索引位。一个 BitSet 可用于通过逻辑 AND、逻辑异或和逻辑异或操作来修改另一个 BitSet 的内容。
默认情况下,集合中的所有位最初都具有值 false。
每个位集都有一个当前大小,即该位集当前使用的空间位数。请注意,大小与位集的实现有关,因此它可能会随着实现而改变。位集的长度与位集的逻辑长度相关,并且独立于实现来定义。
除非另有说明,否则将 null 参数传递给 BitSet 中的任何方法都将导致 NullPointerException。如果没有外部同步,BitSet 对于多线程使用是不安全的。
您可以为每个位索引使用 2 位索引。实际使用 10 位(索引从 1 到 10,设置位 0、4、8):
单一指标:
i = 0100010001
Index1 = i
两个组合索引:
i1 = 01000
i2 = 10001
Index2 = [i1, i2];
Index2.fragment_length = 5
数组 在伪代码中,检索或设置一个位
set(Index, bit) {
fragment = quotient(bit, Index.flagment_length); //quotient = integer division
bit_index = module(bit, Index.flagment_length); //index of the bit in the fragment
set(Index[fragment], bit-or(Index[Fragment], bit-shift-left(1 << bit_index))); //Set the bit indexes vector fragment with or-ing the appropriate bitmask
}
get(Index, bit) {
fragment = quotient(bit, Index.flagment_length); //quotient = integer division
bit_index = module(bit, Index.flagment_length); //index of the bit in the fragment
if (get(Index[fragment], bit-and(Index[Fragment], bit-shift-left(1 << bit_index))) > 0) then true else false; //Get the bit indexes vector fragment bit with and-ing the appropriate bitmask and return true or false
}
我希望已经了解您的要求!