C++ 数字的二进制表示的大小

C++ 数字的二进制表示的大小,c++,c,file,binary,computer-science,C++,C,File,Binary,Computer Science,我们通常说,数字5可以表示为3位二进制数。但是,如果我们将5转换为其二进制表示形式,即101并将其打印到文本文件中,它实际上需要3字节作为字符数组读取。如何创建一个文件(不一定是文本文件),使该文件的大小为3位?我认为您不会得到一个文件系统,它会告诉您该文件为3位。它将至少是一个字节,加上存储文件的额外信息 但是您可以简单地打开一个文件进行写入,然后将3作为二进制文件写入 FILE *ptr; ptr = fopen("file", "wb"); fwrite('a', 1, 1, ptr)

我们通常说,数字
5
可以表示为
3
位二进制数。但是,如果我们将
5
转换为其二进制表示形式,即
101
并将其打印到文本文件中,它实际上需要
3
字节作为字符数组读取。如何创建一个文件(不一定是文本文件),使该文件的大小为
3
位?

我认为您不会得到一个文件系统,它会告诉您该文件为3位。它将至少是一个字节,加上存储文件的额外信息

但是您可以简单地打开一个文件进行写入,然后将
3
作为二进制文件写入

FILE *ptr;

ptr = fopen("file", "wb");

fwrite('a', 1, 1, ptr);

我不认为你会得到一个能告诉你文件是3位的文件系统。它将至少是一个字节,加上存储文件的额外信息

但是您可以简单地打开一个文件进行写入,然后将
3
作为二进制文件写入

FILE *ptr;

ptr = fopen("file", "wb");

fwrite('a', 1, 1, ptr);

您可以在逻辑上将5表示为三位,但无论是文件系统还是内存管理系统(用于RAM),都不允许您以小于一个字节的单位来寻址空间

如果你有八个这样的数字,你可以将它们打包成24位=3字节,并“有效地”存储在内存或文件中。有效地使用引号,因为在节省一些空间的同时,处理压缩数据变得很困难,因为您需要对数据进行大量的位移位。CPU指令、内存负载、数组索引等都不能使用少于字节的单位


最实际的方法是只使用一个完整的字节作为三位,并承受开销

您可以在逻辑上将5表示为三位,但无论是文件系统还是内存管理系统(用于RAM),都不允许您以小于一个字节的单位来寻址空间

如果你有八个这样的数字,你可以将它们打包成24位=3字节,并“有效地”存储在内存或文件中。有效地使用引号,因为在节省一些空间的同时,处理压缩数据变得很困难,因为您需要对数据进行大量的位移位。CPU指令、内存负载、数组索引等都不能使用少于字节的单位


最实际的方法是只使用一个完整的字节作为三位,并承受开销

通常不能,因为二进制文件的最小“量”是一个字节(8位)。
使用存储位长度不均匀的符号有一些有趣的地方。在阅读全文之前,请先解释一下:您的字母符号都保留在二叉树的叶子上。有一条1(即左)0(即右)的路径,从根开始,到达符号。如果树是不平衡的(也可能是不平衡的),则可以用不同的位长度唯一地表示不同的符号。当然,这需要一些努力,因为您必须始终在字节级别读取文件,然后使用算法实现解包和处理位。

通常不能,因为二进制文件的最小“量”是一个字节(8位)。
使用存储位长度不均匀的符号有一些有趣的地方。在阅读全文之前,请先解释一下:您的字母符号都保留在二叉树的叶子上。有一条1(即左)0(即右)的路径,从根开始,到达符号。如果树是不平衡的(也可能是不平衡的),则可以用不同的位长度唯一地表示不同的符号。当然,这需要一些努力,因为您必须始终在字节级别读取文件,然后使用算法实现解包和处理位。

您可以使用以下代码并在此基础上工作……以下代码在单个字节中存储三个数字(5、3和2)。为了存储3个数字,文件只占用一个字节。一般来说,我们不能在文件中存储部分字节的数据

#include<stdio.h>
struct bits
{
       unsigned char first:3,second:3,third:2;
};
main()
{
    struct bits b;
    FILE *f;
    b.first=5;
    b.second=3;
    b.third=2;

    printf("\ninitial data:%u %u %u",b.first,b.second,b.third);

    /*storing in file*/
    f=fopen("bitsfile","w");
    fwrite(&b,sizeof(b),1,f);
    fclose(f);

    /*reading back from file*/
    f=fopen("bitsfile","r");
    fread(&b,sizeof(b),1,f);
    fclose(f);

    printf("\ndata read from file:%u %u %u",b.first,b.second,b.third);
}
#包括
结构位
{
第一个无符号字符:3,第二个字符:3,第三个字符:2;
};
main()
{
结构位b;
文件*f;
b、 第一个=5;
b、 秒=3;
b、 第三=2;
printf(“\n初始数据:%u%u%u”,b.first、b.second、b.third);
/*存储在文件中*/
f=fopen(“比特文件”,“w”);
fwrite&b,sizeof(b),1,f);
fclose(f);
/*从文件中读回*/
f=fopen(“比特文件”,“r”);
法国联邦储备银行(b、1、f);
fclose(f);
printf(“\n从文件读取的数据:%u%u%u”,b.first、b.second、b.third);
}

您可以使用以下代码并在此基础上工作……以下代码在一个字节中存储三个数字(5、3和2)。为了存储3个数字,文件只占用一个字节。一般来说,我们不能在文件中存储部分字节的数据

#include<stdio.h>
struct bits
{
       unsigned char first:3,second:3,third:2;
};
main()
{
    struct bits b;
    FILE *f;
    b.first=5;
    b.second=3;
    b.third=2;

    printf("\ninitial data:%u %u %u",b.first,b.second,b.third);

    /*storing in file*/
    f=fopen("bitsfile","w");
    fwrite(&b,sizeof(b),1,f);
    fclose(f);

    /*reading back from file*/
    f=fopen("bitsfile","r");
    fread(&b,sizeof(b),1,f);
    fclose(f);

    printf("\ndata read from file:%u %u %u",b.first,b.second,b.third);
}
#包括
结构位
{
第一个无符号字符:3,第二个字符:3,第三个字符:2;
};
main()
{
结构位b;
文件*f;
b、 第一个=5;
b、 秒=3;
b、 第三=2;
printf(“\n初始数据:%u%u%u”,b.first、b.second、b.third);
/*存储在文件中*/
f=fopen(“比特文件”,“w”);
fwrite&b,sizeof(b),1,f);
fclose(f);
/*从文件中读回*/
f=fopen(“比特文件”,“r”);
法国联邦储备银行(b、1、f);
fclose(f);
printf(“\n从文件读取的数据:%u%u%u”,b.first、b.second、b.third);
}

您不能。文件系统以字节为单位保存文件,而不是以位为单位。因此,不可能在小于1字节的时间内表示5?您可以生成一个占用一个字节的文件,然后将三位放入其中(需要考虑是否要向左或向右填充)。可寻址内存的最小单位是一个字节。所以,不,你不能寻址一个3位的内存。显然,把一个3位的数字放进一个文件中,使它只占用磁盘上的3位,这既不可能也没有用。但很可能(也可能有用)将其中的许多(n个)填充到一个文件中,这样它将只占用((n*3)/8)+1字节,而不是磁盘上的n*3字节。您不能。文件系统以字节(而不是位)为单位保存文件。因此,不可能在小于1字节的时间内表示5?您可以生成一个占用1字节和p的文件