Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在存储器中存储单个位_C_Byte_Bit_Significant Digits - Fatal编程技术网

C 在存储器中存储单个位

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(一个字节)的随机位。我知道计算机的效率不足以在内存中存储单个位,我们必须在大多数现代机器上存储至少一个字节的数据。我一直在做这方面的研究,但没有发现任何有用的材料。我需要找到一种方法来存储这些位,例如,当从内存中读回这些位时,0不能被计算为00、0000或00000000。为了进一步解释,例如,010不得被读回或评估为00000010。基于值及其基数,数字应该是唯一的

更多的例子

一,≠ 00000001

十,≠ 00000010

0010≠ 00000010

10001≠ 0000001

等等


还有一点我想再次指出的是,位大小始终在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个字节

位字段可能非常棘手


祝你好运!

以这种方式“存储”位需要解决的实际和根本问题是什么?也许你可以将位存储为字符串?我也考虑过这一点,但就我的项目而言,它似乎与根本问题无关。然后