【问题标题】:understanding bit shifting in registers理解寄存器中的位移
【发布时间】:2015-06-18 20:21:17
【问题描述】:

我必须使用这些数据更新 32 位寄存器 其中包括位移,我对两件事感到困惑:

  1. 哪个是 LSB,哪个是 MSB,
  2. 这是什么运算符|

给定表达式:

3 << 0 | 
7 << 3 | 
1 << 6 | 
0 << 7 | 
1 << 7 | 
0 << 8 | 
0 << 10 |
0 << 11 | 
0 << 12 | 
0 << 13 | 
0 << 14  

剩下的 15 位是0

假设寄存器中的初始位为 0,数据如何移位?

011 111 1 0 1 0 0 0 0 0 0 X.......X

x .....X 0 0 0 0 0 0 1 0 1 111 011 

【问题讨论】:

  • 请阅读有关位操作的教程。可能还有其他缺失的信息。问一个问题是没有用的,因为你很难对这个领域有一个一致的了解。如果您使用 C,请阅读一本书。更好的还涵盖了与 C 相关的位操作。对于|&lt;&lt;,请注意这些对于每种语言都不相同。尤其是移位运算符的行为可能与您的实际预期不同 - 尤其是右移位。

标签: embedded


【解决方案1】:

LSB(Least-significant bit)是代表1(2^0)的位,MSB是代表2^(n-1)的位,其中n是寄存器中的位数.一般来说,以二进制写出时,MSB 是最左边的位,LSB 是最右边的位。通常情况下,LSB 在硬件文档中显示为位 0,尽管我知道有一家公司将位编号颠倒以便 MSB 编号为 0。

&lt;&lt; 是 C 左移运算符,将位从 LSB 移向 MSB。因此7&lt;&lt;3 在二进制中代表111000

| 是 C 位或运算符。如果任一相应的输入位为 1,则这用于组合结果位为 1 的值。

查看你的原始值3 &lt;&lt; 0 | 7 &lt;&lt; 3 | 1 &lt;&lt; 6 | 0 &lt;&lt; 7 | 1 &lt;&lt; 7 | 0 &lt;&lt; 8 | 0 &lt;&lt; 10 | 0 &lt;&lt; 11| 0 &lt;&lt; 12 | 0 &lt;&lt; 13 | 0 &lt;&lt; 14

0000 0000 0000 0011 来自3&lt;&lt;0

0000 0000 0011 1000 来自7&lt;&lt;3

0000 0000 0100 0000 来自1&lt;&lt;6

0000 0000 0000 0000 来自0&lt;&lt;7

等等

这种类型的构造通常用于描述进入寄存器的值,注意寄存器的各个字段。

【讨论】:

  • "... 反转位编号,使 MSB 编号为 0。"我只在 90 年代的 PPC601 文档中看到了这一点。非常混乱。
猜你喜欢
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
相关资源
最近更新 更多