比特,字节和数字。缩小字节的大小

时间:2012-10-30 17:05:55

标签: word byte bits

这可能是一个非常基本的低级架构问题。我正试图绕过它。如果我的理解错误,请更正。

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

问题:

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

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

3.。)现在要代表8位数字,我们需要27位(记住着名的问题,排序1百万8位数字,只有1 MB RAM)。我们可以使用27位,即32位(4字节) - 5位吗?并使用这5位数字做其他事情?

感谢您的回答!

2 个答案:

答案 0 :(得分:1)

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

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

此示例使用C运算符,但它们也用于其他几种语言中的相同目的(请参阅下文 - C 中此示例的完整,可编译版本)。您可能需要查找按位运算符 AND &), OR |)和左移<<);

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;
}

答案 1 :(得分:0)

我认为这里需要澄清2点:
1.记忆寻址。
2. Word

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

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

现在我会尝试回答这些问题:

  

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

您可以随时为一堆内容定义自己的解释。

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

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

  

3.。)现在要代表8位数字,我们需要27位(记住着名的问题,排序1百万8位数字,只有1 MB RAM)。   我们可以使用27位,即32位(4字节) - 5位吗?和   用其他5位数字?

是的,你也可以这样做。但是你知道很好的时空权衡。 你确定每个号码保存5位。但是你需要使用位操作和所有非常酷但难以阅读的东西。缩短时间并使代码更复杂 但我不认为你会遇到需要这种保存水平的情况,除非你正在为一个非常有限的系统编码。 (嵌入式等)