有效地存储位索引

时间:2012-06-16 13:15:59

标签: c# 32bit-64bit bit

我想在一系列位中存储某些索引。位数是
的幂 两个,可以安全地假设最大索引为255(起始索引为0)。之前我将每个索引存储为整数。但这占用了太多的记忆。

我想使用像面具这样的东西。

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

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

谢谢: - )

3 个答案:

答案 0 :(得分:1)

.NET有这样一种内置类:BitArray

这将允许您有效地存储一串位(以bool的形式)。

您可以使用BitArrayAndOrXor方法对Not进行按位操作。

您可以使用bool,bytes或int初始化BitArray。例如,您可以使用00101100初始化它,如下所示:

BitArray bits = new BitArray(new byte[] { 0x2C }); // 0x2C == 00101100

答案 1 :(得分: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
}

我希望了解你的要求!

答案 2 :(得分:0)

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

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

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

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

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

相关问题