繁体   English   中英

数字的二进制表示的大小

[英]Size of binary representation of a number

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

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

如果您有八个数字,则可以将它们打包成24位= 3字节,然后将其“有效”存储在内存或文件中。 有效地使用引号,因为在节省空间的同时,打包数据变得很困难,因为您需要对数据进行很多移位。 CPU指令,内存负载,数组索引等均不适用于少于字节的单元。

最实用的方法是只为您的三个位使用一个完整的字节并承担额外的开销。

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

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

FILE *ptr;

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

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

您可以使用以下代码并在此基础上工作...以下代码在单个字节中存储三个数字(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);
}

通常,您不能这样做,因为二进制文件具有一个字节(8位)的最小“量子”。 使用霍夫曼编码来存储具有不均匀比特长度的符号有一些有趣的事情。 在阅读完整的文章之前只是为了解释一下:您的字母符号每个都停留在二叉树的叶子上。 从根部开始到符号的路径为1(即,左)0(即,右)。 如果树不平衡(可能是这样),则可以用不同的位长唯一地表示不同的符号。 当然,需要付出一些努力,因为您必须始终以字节级别读取文件,然后使用算法实现解压缩并处理这些位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM