存储三元值最紧凑的方法是什么?

我正在编写一个简单的flash文件系统,我需要在flash设备中为每个页面存储三种状态之一:

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 */
...
点赞