c - 存储三元值的最紧凑方式是什么?

标签 c

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

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/

相关文章:

c - 重新分配无效的旧大小

c - C 语言的简单 GCD 程序,无法从扫描仪过滤正确的用户输入

python - 将几行 C 语言翻译成 Python

objective-c - 从 C 函数回调访问 ObjC 对象

c - 如何连接两个整数数组

c - OpenGL 在顶点着色器中找到 `in vec3 vert` 但不是 `in float val`

c - 用户输入字符串(使用 fgets)中最后一个字符的 ASCII 值输出为 10,而预期值为 0

C - 移动数组

C中的客户端服务器程序

C语言改变流