我正在编写一个简单的闪存文件系统,我需要为闪存设备中的每个页面存储三种状态之一:
FREE
INVALID (ready to be freed)
VALID
如果只有两种可能的状态,我肯定会使用位图(内存是个问题)。但在这种情况下,保存这些值的最紧凑方式是什么?
我唯一能想到的是将四个 2 位值打包成一个 char
并使用位掩码对每个值进行操作。
例如(写得很快,所以不能保证它完美运行):
#define FREE 0x0 // 0b00
#define INVALID 0x1 // 0b01
#define VALID 0x2 // 0b10
char state[NUM_ITEMS/4];
void set_state(int item_num, int state) {
int idx;
char tmp;
idx = item_num / 4;
tmp = state[idx];
tmp &= ~(0x3 << (item_num % 4));
tmp |= (state << (item_num % 4));
state[idx] = tmp;
}
int main(void) {
//...
set_state(6, INVALID);
//...
return 0;
}
还有其他我不知道的选择吗?
最佳答案
基地 3
0, 1, 2
10, 11, 12, /* 3, 4, 5 in base 10 */
20, 21, 22 /* 6, 7, 8 */
100, 101, 102 /* 9, 10, 11 */
...
关于c - 存储三元值的最紧凑方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43769437/