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

时间:2017-05-03 20:29:25

标签: c

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

FREE
INVALID (ready to be freed)
VALID

如果它只是两种可能的状态,我肯定会使用位图(内存是一个问题)。但在这种情况下,保持这些价值观的最紧凑方式是什么?

我唯一能想到的是将4个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;
}

还有其他我不知道的选择吗?

4 个答案:

答案 0 :(得分:3)

基地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 */
...

答案 1 :(得分:1)

(几乎)没有压缩你能做的最好的事情就是在一个字节中打包5个三元值(trits)。枚举五个连续曲线的每个可能组合:

FFFFF (0)
FFFFI (1)
FFFFV (2)
FFFIF (4) 
...
VVVVV (242)

有243个这样的组合,因此,8位字节(2 ** 8 = 256)足以存储它们中的任何一个。同样,您可以在2个字节中存储10个trits,在3个字节中存储15个trits等。

答案 2 :(得分:0)

如果不考虑性能,则每8位字符可以容纳五个三元值。第一个三元值存储为x,第二个存储为x*3,第三个存储为x*3*3,第四个存储为x*3*3*3等等。

要从char获取第0个三元值,让我们调用y,您需要y % 3。要获得第二个三元值,请将(y/3) % 3(y/(3*3)) % 3作为第三个等等。

与每个字符存储4个三元值相比,这将导致更多的分割,但您可以通过此方法挤出额外的值。

答案 3 :(得分:-1)

在C99中,定义了_Bool类型(标准头定义了宏bool,意思是_Bool。),它可以存储值0和1(不意味着它占用的空间是1位,它取值一个char类型(1个字节))。  您可以寻址单个位,但在内存级别,可能的最小分配是一个字节。  最终意味着您可以使用3个值(每个值取一个字节),并将它们设置为不同的值。

有趣的数据:&#34; [...]没有要求一个字节是8位 - 实际上,基本上是C标准所做的唯一参考a&#34;字节&#34;就像存储char所需的存储量一样。它确实需要一个char能够保存至少255个唯一值,因此它必须至少为8位,但如果需要它可能完全超过它。&#34;

Extract from quora art