【问题标题】:Bits, Bytes and numbers. Shrink the size of the byte位、字节和数字。缩小字节大小
【发布时间】:2012-10-30 17:05:54
【问题描述】:

这可能是一个非常基本的低级架构问题。我正在努力解决它。如果我的理解有误,也请指正。

字 = 64 位、32 位等。这是计算机一次可以读取的位数。

问题:

1.) 这是否意味着,我们可以为 32 位发送 4 个数字(每个 8 位/字节长度)?还是一次8位(字节)、32位(4字节)等数字的组合?

2.) 如果我们只需要发送 8 位数字,那么它如何组成一个单词?只有第一个字节被填充,其余所有字节都用 0 填充,或者最后一个字节被填充,而其余字节用 0 填充?或者我看到像第一个字节这样的地方有关于如何填充其余字节的信息。这适用于这里吗?例如,UTF-8。在这里,ASCII 是 1 个字节,而其他一些字符最多占用 4 个字节。所以当我们发送一个 char 时,我们将所有 4 个字节一起发送,但是按照 char 和其余字节 0 的要求填充字节?

3.) 现在要表示 8 位数字,我们需要 27 位(记住著名的问题,仅用 1 MB RAM 对 100 万个 8 位数字进行排序)。我们可以准确地使用 27 位,即 32 位(4 字节)- 5 位吗?并将这 5 位数字用于其他用途?

感谢您的回答!

【问题讨论】:

    标签: word byte bits


    【解决方案1】:

    1- 是的,四个 8 位整数可以放入一个 32 位整数。这可以使用按位运算来完成,例如(使用 C 运算符):

    ((a & 255) << 24) | ((b & 255) << 16) | ((c & 255) << 8) | (d & 255)
    

    此示例使用 C 运算符,但它们在其他几种语言中也用于相同目的(见下文 - 此示例在 C 中的完整、可编译版本)。您可能需要查找按位运算符 AND (&amp;)、OR (|) 和 Left Shift (@987654324 @);

    2- 未使用的位一般为0。第一个字节有时用于表示编码的类型(查找“幻数”),但这取决于实现。有时是不同的位数。

    3- 8 位数字组可以被压缩为每组仅使用 27 位。这与示例非常相似,只是数据的位数和大小不同。为此,您需要 864 位组,即 27 个 32 位整数来存储 32 个 27 位数字。这将比示例更复杂,但会使用相同的原理。


    完整、可编译的 C 语言示例:

    #include <stdio.h>
    
    /*Compresses four integers containing one byte of data in the least
     *significant byte into a single 32-bit integer*/
    __int32 compress(int a, int b, int c, int d){
       __int32 compressed = ((a & 255) << 24) | ((b & 255) << 16) |
          ((c & 255) << 8) | (d & 255);
       return compressed;
    }
    
    /*Test the compress() function and print the resuts*/
    int main(){
       printf("%x\n", (unsigned)compress(255, 0, 255, 0));
       printf("%x\n", (unsigned)compress(192, 168, 0, 255));
       printf("%x\n", (unsigned)compress(84, 94, 255, 2));
       return 0;
    }
    

    【讨论】:

      【解决方案2】:

      我认为这里需要澄清两点:
      1. 内存寻址。
      2.单词

      内存可以通过两种方式寻址,它们通常是字节寻址或字寻址。 字节可寻址内存意味着每个字节都有一个单独的地址。
      a -> 第 0 个字节
      b -> 第一个字节
      字可寻址存储器是指每组与字一样宽的字节获得地址的存储器。例如,如果字长是 32 位:
      a->第0个字节
      b->第 4 个字节
      等等。

      单词
      我想说一个词定义了处理器一次可以处理的最大位数。例如,对于 8086,它是 16。 它通常是处理器可以执行算术运算的最大数。继续这个例子,8086 可以一次对 16 位数字执行操作。

      现在我将尝试回答问题:

      1.) 这是否意味着,我们可以为 32 位发送 4 个数字(每个 8 位/字节长度)?或 8 位(字节)、32 位(4 字节)的组合, 一次等数字?

      您始终可以为一堆位定义自己的解释。

      例如,如果它是字节可寻址的,我们可以单独处理每个字节,因此,我们可以在汇编级别编写代码,将每个字节视为一个单独的 8 位数字。 如果不是,您可以使用位操作来提取单个字节。
      关键是您可以用 32 位表示 4 个 8 位数字。

      2) 大多数情况下,剩余的有效位用 0 填充(对于无符号数)

      3.) 现在要表示 8 位数字,我们需要 27 位(记住著名的问题,仅用 1 MB RAM 对 100 万个 8 位数字进行排序)。 我们可以准确地使用 27 位,即 32 位(4 字节)- 5 位吗?和 将这 5 位数字用于其他用途?

      是的,您也可以这样做。但你知道伟大的时空权衡。 您肯定会为每个数字节省 5 位。但是你需要使用位操作和所有非常酷但难以阅读的东西。增加时间并使代码更复杂。
      但是我认为您永远不会遇到需要这种级别的储蓄的情况,除非您正在为一个非常受限的系统进行编码。 (嵌入式等)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 2017-10-17
        • 1970-01-01
        • 2017-04-22
        • 2013-10-21
        • 1970-01-01
        相关资源
        最近更新 更多