Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有效地存储位索引_C#_32bit 64bit_Bit - Fatal编程技术网

C# 有效地存储位索引

C# 有效地存储位索引,c#,32bit-64bit,bit,C#,32bit 64bit,Bit,我想以位序列存储某些索引。位数是 二,可以安全地假设最大索引为255(起始索引为0)。早些时候,我将每个索引存储为一个整数。但这占用了太多的内存 我想用些面具之类的东西 例如:如果我想存储索引0,3,5,那么我将101001即41存储为整数 问题是我拥有的最大索引是255,使用上述技术我可以存储索引 仅限64位(使用64位整数)。我还有别的办法吗 谢谢:-)您可以为每个位索引使用2位索引。 实际使用10位(索引从1到10,设置位0、4、8): 单一索引: i = 0100010001 Index

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

我想用些面具之类的东西

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

问题是我拥有的最大索引是255,使用上述技术我可以存储索引 仅限64位(使用64位整数)。我还有别的办法吗


谢谢:-)

您可以为每个位索引使用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
}
set(索引,位){
片段=商(位,索引.标记长度);//商=整数除法
bit_index=module(bit,index.flagment_length);//片段中位的索引
set(Index[fragment]、bit或(Index[fragment]、bit向左移位(1在java中,位索引变得简单,如下小教程所示…

此类实现一个按需增长的位向量。位集的每个组件都有一个布尔值。位集的位由非负整数索引。可以检查、设置或清除单个索引位。一个位集可用于通过逻辑AND、逻辑inclusive or和逻辑AND修改另一位集的内容独占或操作

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

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


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

.NET有一个用于此类操作的内置类:

这将使您能够高效地存储一串位(以布尔的形式)

您可以使用
异或
方法对
位数组
执行逐位操作

您可以使用布尔、字节或整数初始化
位数组
。例如,您可以使用
00101100
初始化它,如下所示:

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

你用的是什么语言?那就用一个ulong数组。简单。或者是BitArray,但是有点慢。