0

我想将某些索引存储在位序列中。位数是 2 的幂,
可以安全地假设最大索引为 255(起始索引为 0)。早些时候我将每个索引存储为一个整数。但这占用了太多的内存。

我想用面具之类的东西。

例如:如果我想存储索引 0、3、5,那么我将 101001 即 41 存储为整数。

问题是我拥有的最大索引是 255 并且使用上述技术我只能将索引存储到 64(使用 64 位整数)。我还有其他方法可以做到这一点吗?

谢谢 :-)

4

3 回答 3

1

.NET 有一个用于此类事情的内置类:BitArray

这将让您有效地存储一串位(以布尔的形式)。

您可以使用、、和方法对BitArrays执行按位运算。AndOrXorNot

BitArray您可以使用布尔值、字节或整数来初始化 a 。例如,您可以00101100像这样初始化它:

BitArray bits = new BitArray(new byte[] { 0x2C }); // 0x2C == 00101100
于 2012-06-16T14:07:23.527 回答
0

在java中,位索引变得容易,如下面的小教程......

这个类实现了一个根据需要增长的位向量。位集的每个组件都有一个布尔值。BitSet 的位由非负整数索引。可以检查、设置或清除各个索引位。一个 BitSet 可用于通过逻辑 AND、逻辑异或和逻辑异或操作来修改另一个 BitSet 的内容。

默认情况下,集合中的所有位最初都具有值 false。

每个位集都有一个当前大小,即该位集当前使用的空间位数。请注意,大小与位集的实现有关,因此它可能会随着实现而改变。位集的长度与位集的逻辑长度相关,并且独立于实现来定义。

除非另有说明,否则将 null 参数传递给 BitSet 中的任何方法都将导致 NullPointerException。如果没有外部同步,BitSet 对于多线程使用是不安全的。

于 2012-06-16T13:46:32.430 回答
0

您可以为每个位索引使用 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
}

我希望已经了解您的要求!

于 2012-06-16T13:40:16.130 回答