【问题标题】:Getting value from a 16-bit register从 16 位寄存器中获取值
【发布时间】:2016-04-14 09:12:55
【问题描述】:

我有一个 16 位寄存器

  • 位 0 的值为 0
  • 位 1...2 的值为 3
  • 位 3 的值为 1
  • 位 4 的值为 1

所以最后我的寄存器中写入的值是 30,因为:

(0 x 1) + (3 x 2) + (1 x 8) + (1 x 16) = 30  

现在我想做反向操作以获取位中写入的值:

(30 & 1) / 1 = 0  
(30 & 2) / 2 = 1 (this is wrong, it should be 3)  
(30 & 8) / 8 = 1  
(30 & 16) / 16 = 1  

我做错了什么?

【问题讨论】:

    标签: bit-manipulation bit bit-shift cpu-registers bit-fields


    【解决方案1】:
    (30 & 2) / 2 = 1 (this is wrong, it should be 3)
    

    这是错误的。要获得 2 位,您必须将 3 位移动其位。在这种情况下,你 and3 << 1 = 6

    (30 & 6) / 2 = 3
    

    【讨论】:

    • Hm.... 如果我有同样的情况,但第 9 位也有一些值。那么在这种情况下,寄存器中的值为 1054。第 9..10 位保持值 2。
    • 所以只是将 3 位移了 9 位。把这些位写在纸上,你会看到的。通常在位置 m 处获取 n 位,并使用 ((1 << n) - 1) << m
    • 非常感谢。这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 2012-04-11
    • 2010-10-13
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多