C语言 在内存中存储单个位



所以我想在内存中存储长度为 1 到 8(一个字节(的随机位。我知道计算机的效率不足以将单个位存储在内存中,我们必须在大多数现代机器上至少存储一个 BYTE 数据。我一直在对此进行一些研究,但没有遇到任何有用的材料。我需要找到一种方法来存储这些位,例如,当从内存中读回位时,0 不得计算为 00, 0000 或 00000000。例如,为了进一步解释,不得按00000010回读或评估010。数字应该根据值及其基数是唯一的。

更多例子;

1 ≠ 00000001

10 ≠ 00000010

0010 ≠ 00000010

10001≠ 00010001

等等...

我还想再次指出的一件事是,位大小始终在 1 到 8(含(之间,并且不是一个固定的数字。我正在使用 C 来解决这个问题。

所以你想把位存储在内存中,然后在不知道它们有多长的情况下读回它们。这是不可能的。(字节也不可能(

想象一下,如果你能做到这一点。然后我们可以压缩文件,例如,说"0"压缩为"0","1"压缩为"00"。在此"压缩"(这实际上会使文件更大(之后,我们有一个只有 0 的文件。然后,我们通过写下有多少个 0 来压缩文件中只有 0 的文件。了不起!任何 2GB 文件仅压缩为 4 个字节。但我们知道不可能将每个 2GB 文件压缩为 4 个字节。所以这个想法有问题。

您可以从内存中读取几个位,但您需要知道您正在读取多少位。如果您不知道正在读取多少位,也可以这样做,但组合不会"重叠"。因此,如果"01"是有效的组合,那么您不能使用"010",因为这会与"01"重叠。但是你可以有"001"。这称为前缀代码,用于霍夫曼编码,一种压缩类型。

当然,您也可以保存每个数字之前的长度。因此,您可以将"0"保存为"0010",其中"001"表示数字的长度。对于 3 位长度,您最多只能有 7 位数字。或者,如果从长度中减去 1,则为 8 位数字,在这种情况下,您不能有零位数字。(所以"0"变成了"0000","101"变成了"010101",等等(

您可以使用位移运算符或位字段来控制位

确保您了解 endianess 概念,即依赖于机器。 请记住,位字段需要结构,结构至少使用 4 个字节。

位字段可能非常棘手。

祝你好运!

如果你只需要确保一个给定的二进制数被正确计算,那么你有两个选择,我能想到。您可以将每个数字的所有位数与给定的数字一起存储,这不会那么有效。

但是您也可以将所有二进制数存储为 8 位,然后在处理每个单独的数字时,遍历其所有数字以找到其长度。这样,您只需一次存储单个数字的长度。

这里有一些快速代码,希望它很清楚:

Uint8 rightNumber = 2; //Which is 10 in binary, or 00000010 
int rightLength = 2; //Since it is 2 bits long
Uint8 bn = mySuperbBinaryValueIWantToTest;
int i;
for(i = 7; i > 0; i--)
{
if((bn & (1 << i)) != 0)break;
}
int length = i + 1;
if(bn == rightNumber && length == rightLength) printf("Correct number");
else printf("Incorrect number");

请记住,您也可以使用相同的技术来计算正确值内的位数,而不是预先计算它。如果要比较任意值,则也可以这样做。 希望这有帮助,如果没有,请随时批评/重新解释您的问题

最新更新