我需要在内存中存储一个非常长的数组。每个数组项只是一个标记TRUE/FALSE(0/1)。因为我需要它非常节省内存,所以我考虑实现它作为掩码位的方式,放在unsigned char
region之上。每个内存中的char
应该至少给我8个标记位。我已经实现了以下函数:
static SIZE = 8; /* 8 bits = 1 byte = 1 char */
/* creates and initializes the array for N elements */
unsigned char *new_bit_array(long n) {
int extra = (n % SIZE) ? 1 : 0;
size_t ms = ((n / SIZE)+extra) * sizeof(unsigned char);
unsigned char *p = malloc(ms);
memset(p,0xFF,ms);
return p;
}
/* mask setter for nth bit of a char, call by function bit_array_set*/
char bit_mask_set(short nbit,short value) {
if (value)
return 0xFF;
if (nbit == 0)
return 0x7F;
else if (nbit == 1)
return 0xBF;
else if (nbit == 2)
return 0xDF;
else if (nbit == 3)
return 0xEF;
else if (nbit == 4)
return 0xF7;
else if (nbit == 5)
return 0xFB;
else if (nbit == 6)
return 0xFD;
else if (nbit == 7)
return 0xFE;
return 0xFF;
}
/* mask setter for nth element of the array */
void bit_array_set(unsigned char *p,long i,int value) {
p[i/] &= bit_mask_set(i % SIZE,value);
}
/* mask getter for nth bit of a char, call by function bit_array_get */
char bit_mask_get(short nbit) {
if (nbit == 0)
return 0x80;
else if (nbit == 1)
return 0x40;
else if (nbit == 2)
return 0x20;
else if (nbit == 3)
return 0x10;
else if (nbit == 4)
return 0x08;
else if (nbit == 5)
return 0x04;
else if (nbit == 6)
return 0x02;
else if (nbit == 7)
return 0x01;
return 0x00;
}
/* mask getter for nth element of the array */
short bit_array_get(unsigned char *p,long i) {
return p[i/SIZE] & bit_mask_get(i % SIZE) ? 1 : 0;
}
这段代码可以正常工作,但我的问题是是否在C语言或任何广泛使用的库中(如glib)有任何内置功能提供相同的功能?
... 还有没有更好的实现bit_mask_get
和bit_mask_set
的方法,7个分支IF看起来很丑陋。对于这段代码的任何其他评论也非常欢迎。
switch
语句,老实说,它并没有对代码产生太大的改变。基本上还是一样的东西。 - Manuel Salvadores0xff ^ (1 << (7-nbit))
可以消除bit_mask_set
中的if-else
语句。 - user786653