OK、まず、3 バイトを 1 つの整数に入れようとします。シフトとOR
ロジックを使用します。と入力変数がa
あるとします。(それぞれ、 、およびに分割されます)。b
c
Uof
a
b
c
まず、b
変数用にさらに 1 バイトのスペースを追加します。
(b << 8)
に変換01101111
され0110111100000000
ます。
では、ゼロは実際には次のようにOR
c
なります。b
c
((b << 8) | c))
次に、 で同じロジックを実行しa
ます。の右側にさらに 16 ビットを予約するa
ので、OR
取得した最後の式を取得できます。
((a << 16) | ((b << 8) | c))
ここまでで、すべてのビットが 1 つの 4 バイト整数にマージされました。
ここで必要なのは、それをそれぞれ 6 ビットの 4 つの部分に分割することだけです。これにはマスクロジックを使用します。
まず、「マスク」ロジックを使用する場合、マスク自体を作成する必要があります。マスクは0x3F
(2 進数 111111、つまり 6 ビットから) であるため、AND
このマスクを使用して数値を計算すると、右側の最初の 6 ビットを抽出できます。
r1 = (merged & 0x00003F);
の略r1
ですresult 1
。
さて、同じことですが、マージされた数値が 6 ビット右にあるため、次の 6 ビット数値を取得できます。残りは以下のようになります。
r1 = ((merged >> 0) & 0x3F);
r2 = ((merged >> 6) & 0x3F);
r3 = ((merged >> 12) & 0x3F);
r4 = ((merged >> 18) & 0x3F);
したがって、最終的なコードは次のようになります。
char /*or int*/ a, b, c;
int merged, r1, r2, r3, r4;
scanf(" %c %c %c", &a, &b, &c);
merged = ((a << 16) | ((b << 8) | c));
r1 = ((merged >> 0) & 0x3F);
r2 = ((merged >> 6) & 0x3F);
r3 = ((merged >> 12) & 0x3F);
r4 = ((merged >> 18) & 0x3F);
printf("%d %d %d %d\n", r1, r2, r3, r4);
編集:マスク部分を修正しました。