【问题标题】:Size of binary representation of a number数字的二进制表示的大小
【发布时间】:2014-03-20 05:19:19
【问题描述】:

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

【问题讨论】:

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

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


【解决方案1】:

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

如果您有 8 个这样的数字,您可以将它们打包成 24 位 = 3 字节,然后将它们“有效”地存储在内存或文件中。有效地引用引号,因为虽然您节省了一些空间,但处理打包数据变得很困难,因为您需要对很多东西进行位移。 CPU 指令、内存负载、数组索引等都不适用于小于字节的单位。

最实用的方法是只为您的三位使用一个完整的字节并忍受开销。

【讨论】:

    【解决方案2】:

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

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

    FILE *ptr;
    
    ptr = fopen("file", "wb");
    
    fwrite('a', 1, 1, ptr);
    

    【讨论】:

      【解决方案3】:

      您可以使用以下代码并以此为基础工作...以下代码将三个数字(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);
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-07
          • 1970-01-01
          • 1970-01-01
          • 2012-01-24
          • 2021-04-20
          • 2019-07-24
          • 1970-01-01
          相关资源
          最近更新 更多