1

それは非常に基本的な低レベルのアーキテクチャに関する質問かもしれません。私はそれについて頭を悩ませようとしています。私の理解が間違っている場合も修正してください。

Word = 64 ビット、32 ビットなど。これは、コンピュータが一度に読み取ることができるビット数です。

質問:

1.) これは、32 ビットで 4 つの数値 (それぞれ 8 ビット/バイト長) を送信できることを意味しますか? または、一度に 8 ビット (バイト)、32 ビット (4 バイト) などの数値を組み合わせますか?

2.) 8 ビットの数値のみを送信する必要がある場合、それはどのように単語を形成しますか? 最初のバイトのみが埋められ、残りのすべてのバイトが 0 で埋められるか、残りのバイトが 0 で埋められている間に最後のバイトが埋められますか? または、最初のバイトのように、残りのバイトがどのように埋められるかに関する情報があるのを見ました。それはここに当てはまりますか?たとえば、UTF-8 です。ここで、ASCII は 1 バイトで、その他の一部の文字は最大 4 バイトかかります。では、1 つの文字を送信するときは、4 バイトすべてを一緒に送信しますが、必要に応じて文字と残りのバイトを 0 で埋めますか?

3.) 8 桁の数値を表すには、27 ビットが必要です (1 MB の RAM で 100 万個の 8 桁の数値をソートするという有名な質問を思い出してください)。32 ビット (4 バイト) - 5 ビットである 27 ビットを正確に使用できますか? その 5 桁を別の用途に使用しますか?

あなたの答えに感謝します!

4

2 に答える 2

1

1-はい、4 つの 8 ビット整数は 32 ビット整数に収まります。これは、たとえば (C 演算子を使用して) ビット単位の演算を使用して行うことができます。

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

この例では C 演算子を使用していますが、他のいくつかの言語でも同じ目的で使用されています (以下を参照してください - C でのこの例の完全でコンパイル可能なバージョン)。ビットごとの演算子AND ( &)、OR ( |)、および左シフト( )を調べることができ<<ます。

2-未使用のビットは一般的に0. 最初のバイトは、エンコーディングのタイプを表すために使用されることがあります (「マジック ナンバー」を調べてください) が、これは実装に依存します。場合によっては、ビット数が異なる場合があります。

3- 8 桁の数字のグループは、それぞれ 27 ビットのみを使用するように圧縮できます。これは、データのビット数とサイズが異なることを除いて、例と非常によく似ています。これを行うには、864 ビット グループ、つまり 32 個の 27 ビット数値を格納するために 27 個の 32 ビット整数が必要になります。これは例よりも複雑になりますが、同じ原則を使用します。


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;
}
于 2012-10-31T02:52:31.243 に答える
0

ここでは、次の 2 点について明確にする必要があると思います
。 1. メモリのアドレス指定。
2. ワード

メモリは 2 つの方法でアドレス指定できます。通常、メモリはバイト アドレス指定可能またはワード アドレス指定可能です。 バイト アドレス指定可能メモリとは、各バイトに個別のアドレスが割り当てられることを意味します。
a -> 0 番目のバイト
b -> 1 番目のバイト
ワード アドレス指定可能なメモリは、ワードと同じ幅のバイトの各グループがアドレスを取得するメモリです。たとえば、ワード長が 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 桁の数値をソートするという有名な質問を思い出してください)。32 ビット (4 バイト) - 5 ビットである 27 ビットを正確に使用できますか? その 5 桁を別の用途に使用しますか?

はい、これもできます。しかし、あなたは大きな時空トレードオフを知っています. 数値ごとに 5 ビットを節約できます。ただし、ビット操作と、すべての本当にクールだが読みにくいものを使用する必要があります。時間の短縮とコードの複雑化。
しかし、非常に制約のあるシステムをコーディングしていない限り、そのようなレベルの節約が必要な状況に遭遇することはないと思います。(組み込みなど)

于 2012-10-30T17:44:13.493 に答える