C 在存储器中存储单个位
所以我想在内存中存储长度为1到8(一个字节)的随机位。我知道计算机的效率不足以在内存中存储单个位,我们必须在大多数现代机器上存储至少一个字节的数据。我一直在做这方面的研究,但没有发现任何有用的材料。我需要找到一种方法来存储这些位,例如,当从内存中读回这些位时,0不能被计算为00、0000或00000000。为了进一步解释,例如,010不得被读回或评估为00000010。基于值及其基数,数字应该是唯一的 更多的例子 一,≠ 00000001 十,≠ 00000010 0010≠ 00000010 10001≠ 0000001 等等C 在存储器中存储单个位,c,byte,bit,significant-digits,C,Byte,Bit,Significant Digits,所以我想在内存中存储长度为1到8(一个字节)的随机位。我知道计算机的效率不足以在内存中存储单个位,我们必须在大多数现代机器上存储至少一个字节的数据。我一直在做这方面的研究,但没有发现任何有用的材料。我需要找到一种方法来存储这些位,例如,当从内存中读回这些位时,0不能被计算为00、0000或00000000。为了进一步解释,例如,010不得被读回或评估为00000010。基于值及其基数,数字应该是唯一的 更多的例子 一,≠ 00000001 十,≠ 00000010 0010≠ 00000010
还有一点我想再次指出的是,位大小始终在1和8之间(包括1和8),并且不是一个固定的数字。我用C来解决这个问题。所以你想在内存中存储位,然后在不知道它们有多长的情况下将它们读回。这是不可能的。(使用字节也不可能) 想象一下,如果你能做到这一点。然后我们可以压缩一个文件,比如说,“0”压缩为“0”,而“1”压缩为“00”。在“压缩”之后(这实际上会使文件变大),我们有一个只有0的文件。然后,我们通过记录有多少个0来压缩文件中只有0。太神了任何2GB文件都只压缩到4个字节。但我们知道不可能将每个2GB文件压缩为4字节。所以这个想法有点不对劲 您可以从内存中读取若干位,但需要知道您正在读取多少位。如果您不知道正在读取多少位,但组合不会“重叠”,也可以这样做。所以,如果“01”是一个有效的组合,那么就不能有“010”,因为这将与“01”重叠。但你可以用“001”。这被称为a,用于,一种压缩
当然,您也可以保存每个数字之前的长度。因此,您可以将“0”保存为“0010”,其中“001”表示数字的长度。对于3位长度,最多只能有7位数字。或者,如果从长度中减去1,则为8位数字,在这种情况下,不能有零位数字。(因此“0”变为“0000”,“101”变为“010101”,等等)因此您希望在内存中存储位,并在不知道它们的长度的情况下将其读回。这是不可能的。(使用字节也不可能) 想象一下,如果你能做到这一点。然后我们可以压缩一个文件,比如说,“0”压缩为“0”,而“1”压缩为“00”。在“压缩”之后(这实际上会使文件变大),我们有一个只有0的文件。然后,我们通过记录有多少个0来压缩文件中只有0。太神了任何2GB文件都只压缩到4个字节。但我们知道不可能将每个2GB文件压缩为4字节。所以这个想法有点不对劲 您可以从内存中读取若干位,但需要知道您正在读取多少位。如果您不知道正在读取多少位,但组合不会“重叠”,也可以这样做。所以,如果“01”是一个有效的组合,那么就不能有“010”,因为这将与“01”重叠。但你可以用“001”。这被称为a,用于,一种压缩
当然,您也可以保存每个数字之前的长度。因此,您可以将“0”保存为“0010”,其中“001”表示数字的长度。对于3位长度,最多只能有7位数字。或者,如果从长度中减去1,则为8位数字,在这种情况下,不能有零位数字。(所以“0”变成“0000”,“101”变成“010101”,等等)如果您只需要确保正确计算给定的二进制数,那么我可以想到两个选择。您可以将每个数字的所有位数与给定的数字一起存储,这样效率就不高了 但也可以将所有二进制数存储为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");
Uint8 rightNumber=2//这是二进制的10,或00000010
int rightLength=2//因为它有2位长
Uint8 bn=我的上级价值观测试;
int i;
对于(i=7;i>0;i--)
{
如果((bn&(1如果您只需要确保正确计算给定的二进制数,那么您有两个选择,我可以想到。您可以将每个数字的所有位数与给定的数字一起存储,这样效率就不高了
但是你也可以把所有的二进制数都存储为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");
Uint8 rightNumber=2;//二进制格式为10,或00000010
int rightLength=2;//因为它是2位长
Uint8 bn=我的上级价值观测试;
int i;
对于(i=7;i>0;i--)
{
如果((bn&(1),您可以使用或控制位
请确保您理解,这是机器相关的。请记住,需要一个结构,并且结构至少使用4个字节
位字段可能非常棘手
祝您好运!您可以使用或控制位
请确保您理解,这是机器相关的。请记住,需要一个结构,并且结构至少使用4个字节
位字段可能非常棘手
祝你好运!以这种方式“存储”位需要解决的实际和根本问题是什么?也许你可以将位存储为字符串?我也考虑过这一点,但就我的项目而言,它似乎与根本问题无关。然后