我正在编写一个简单的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;
}
还有其他我不知道的选择吗?
答案 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;