我想在一系列位中存储某些索引。位数是
的幂
两个,可以安全地假设最大索引为255(起始索引为0)。之前我将每个索引存储为整数。但这占用了太多的记忆。
我想使用像面具这样的东西。
例如:如果我想存储索引0,3,5,那么我存储101001,即41作为整数。
问题是我拥有的最大索引是255并且使用上述技术我可以存储索引 直到64(使用64位整数)。有没有其他办法可以做到这一点??
谢谢: - )
答案 0 :(得分:1)
.NET有这样一种内置类:BitArray
这将允许您有效地存储一串位(以bool的形式)。
您可以使用BitArray
,And
,Or
和Xor
方法对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对于多线程使用是不安全的。