我得到了一个保存为字节数组的巨大位数组,它代表所有有符号 int 值(4,294,967,295)。
byte[] bitArray = byte[536870912];
Run Code Online (Sandbox Code Playgroud)
数组中的每个字节代表 8 个数字,每一位代表一个数字。这意味着 byte[0] 存储 1, 2, 3, 4, 5, 6, 7, 8,而 byte[1] 存储 9, 10, 11, 12, 13, 14, 15, 16 等。
我用它来存储一个巨大的表,我可以在其中将数字设置为 true 或 false(0 或 1)。我有一些相当有效的方法来检查是否设置了一个位并设置了一个位(仅使用按位运算符)。
现在我需要一遍又一遍地迭代这个表来找到设置为 0 的位。当然,只存储我想要迭代的数字会相当有效,所以我不需要每次都检查它们,但是数字太多,将它们存储在 ArrayList 中会占用大量内存。
如何有效地多次迭代位数组中未设置的值?
我使用三维char数组实现了一个bloom过滤器(位表),它运行良好,直到达到无法再分配内存并给出bad_alloc消息的程度.在分配600MB后,它在下一个扩展请求中给出了这个错误.
布隆过滤器(阵列)预计会增长到8到10GB.
这是我用来分配(扩展)位表的代码.
unsigned char ***bit_table_=0;
unsigned int ROWS_old=5;
unsigned int EXPND_SIZE=5;
void expand_bit_table()
{
FILE *temp;
temp=fopen("chunk_temp","w+b");
//copy old content
for(int i=0;i<ROWS_old;++i)
for(int j=0;j<ROWS;++j)
fwrite(bit_table_[i][j],COLUMNS,1,temp);
fclose(temp);
//delete old table
chunk_delete_bit_table();
//create expanded bit table ==> add EXP_SIZE more rows
bit_table_=new unsigned char**[ROWS_old+EXPND_SIZE];
for(int i=0;i<ROWS_old+EXPND_SIZE;++i)
{
bit_table_[i]=new unsigned char*[ROWS];
for(int k=0;k<ROWS;++k)
bit_table_[i][k]=new unsigned char[COLUMNS];
}
//copy back old content
temp=fopen("chunk_temp","r+b");
for(int i=0;i<ROWS_old;++i)
{
fread(bit_table_[i],COLUMNS*ROWS,1,temp);
}
fclose(temp);
//set remaining content of bit_table_to 0
for(int i=ROWS_old;i<ROWS_old+EXPND_SIZE;++i)
for(int j=0;j<ROWS;++j)
for(int k=0;k<COLUMNS;++k) …Run Code Online (Sandbox Code Playgroud) 我试图从字节数组中获取正确的int。通过POS for .Net从RFIDTag读取字节。(大约需要18位)
二进制格式的字节数组如下:00001110 11011100 00000000 00011011 10000000
我需要摆脱的是:00 00000000 11101101(int = 237)
从原始字节开始将以相反的顺序为以下位:------ 10 11011100 00000000
我一直在看bitArray。Array.Reverse。以及几种移位位的方法。但是我只是无法绕过这个头。
谁能指出我正确的方向?
我正在尝试使用多维,BitArray但是我对如何设置或读取位感到困惑。
使用正常的一维尺寸,BitArray我可以简单地进行以下设置:
bitArray.Set(0, true);
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何对二维位数组执行相同的操作。例如,以下代码没有意义,因为该Set方法需要一个索引,但是我之前已经在“ [0,0]”中提供了该索引:
bitArray[0, 0].Set(0, true);
Run Code Online (Sandbox Code Playgroud)
我的问题:制作然后使用多维的正确方法是BitArray什么?