数字的二进制表示的大小

时间:2014-03-20 05:19:19

标签: c++ c file binary computer-science

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

4 个答案:

答案 0 :(得分:3)

您可以在逻辑上将5表示为三位,但文件系统和内存管理系统(对于RAM)都不会以小于一个字节的单位来寻址空间。

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

最实用的方法是只使用一个字节用于三位,并承担开销。

答案 1 :(得分:1)

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

但您可以简单地打开一个文件进行编写,并将3写为二进制文件。

FILE *ptr;

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

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

答案 2 :(得分:1)

您可以使用以下代码并根据此工作...以下代码在一个字节中存储三个数字(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 :(得分:0)

由于二进制文件具有最小的“量子”,因此通常不能这样做。这是一个字节(8位)。 使用Huffman Encoding存储具有不均匀比特长度的符号是有趣的。只是在阅读完整文章之前解释一下:您的字母符号在二叉树叶子上保留每一个。从根开始并着陆到您的符号,有一条路径为1(即左)0(即右)。如果树是不平衡的(并且它将是),则可以用不同的比特长度唯一地表示不同的符号。当然需要付出一些努力,因为你必须始终在字节级读取文件,然后使用算法实现解包并处理这些位。