msg type フィールドが最大 5 ビット "<<4" に拡張され、フィールド dup が最大 4 ビット "<<3" に拡張されるのはなぜですか?
<<
フィールドを「展開」せず、左にシフトします。
最初は、各数値は次のようになります。
bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
======================================================================
|------------- type ------------|
|- dup -|
|----- qos -----|
| retain|
各数値がそのフィールドの有効な範囲内にあると仮定すると、それらの数値は既に正しい幅になっています。具体的にtype
は、0 ~ 15 の値を持つことができるため、(最大) 4 ビット幅です。dup
0 または 1でretain
なければならないので、幅は 1 ビットのみです。qos
0 から 3 までの値を持つことができ、これは 2 ビット幅です。
しかし、彼らは間違った場所にいます。それらは下位ビット (3、2、1、0) でスタックします。それらを正しい位置に移動するには、それらを左にシフトする必要があります。
bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
======================================================================
|----------- type<<4 -----------|
| dup<<3|
|---- qos<<1 ---|
| retain|
たとえば、dup
下に 3 つのスペース (実際には値 0 のビット) が必要なため、 は 3 ビット左にシフトされます。retain
すでに正しい場所にあるため、移動する必要はありません。
すべてのビットが正しい場所に配置されると、次のバイトを使用してOR 演算されます。|
bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
======================================================================
|----------- type<<4 -----------| dup<<3|---- qos<<1 ---| retain|
これが求められているものです。