为什么 msg 类型字段最多扩展为 5 位 "<<4" 而字段 dup 最多扩展为 4 位 "<<3" ?
<<
不会“扩展”该字段,而是将其向左移动。
最初,我们的每个数字看起来像这样:
bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
======================================================================
|------------- type ------------|
|- dup -|
|----- qos -----|
| retain|
假设每个数字都在该字段的有效范围内,那么它们已经是正确的宽度。具体来说,type
可以有一个从 0 到 15 的值,所以它是(最多)4 位宽;dup
并且retain
必须为 0 或 1,因此只有 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 位,因为我们想要它下面的 3 个空格(实际上是值为 0 的位)。retain
不需要移动,因为它恰好已经在正确的位置。
一旦所有位都在正确的位置,它们被ORed一起使用|
来给出这个字节:
bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
======================================================================
|----------- type<<4 -----------| dup<<3|---- qos<<1 ---| retain|
这就是想要的。