【问题标题】:How to ignore specific bits in a 32-bit integer如何忽略 32 位整数中的特定位
【发布时间】:2019-11-02 07:33:56
【问题描述】:

我正在轮询电机驱动器中的 32 位寄存器以获取值。

只需要 0-9 位,其余的需要忽略。

如何忽略第 10-31 位?

Image of register bits

为了轮询电机驱动器的值,我发送了寄存器的位置,它发回了整个 32 位数字。但我只需要显示 0-9 位即可。

Serial.println(sendData(0x35, 0))

【问题讨论】:

  • 我猜这是一个 arduino 项目——无论哪种情况,你所拥有的非常短的示例都不是 C。

标签: c++


【解决方案1】:

如果你想提取这些位,那么你必须用一个只保留你感兴趣的位的值来屏蔽整个整数。

这可以通过按位与 (&) 运算符来完成,例如:

uint32_t value = reg & 0x3ff;
uint32_t value = reg & 0b1111111111; // if you have C++11

【讨论】:

  • 我认为 0..9 需要 10 位
【解决方案2】:

我会选择Serial.print() 而不是Serial.println()。 然后,您可以使用 for 循环打印出您感兴趣的特定位。

auto data = sendData(0x35, 0);
for (int i=0; i<=9; ++i)
    Serial.print(data && (1<<i));

任何其他方法都会导致打印额外的位,因为没有保存 10 位的数据结构。

【讨论】:

    【解决方案3】:

    您将数字的最后 10 位设置为 1,按位执行and。这会将所有其他位设置为 0。例如:

    value = value & ((1<<10) - 1);
    

    或者

    value = value & 0x3FF;
    

    【讨论】:

    • 最后 10 位也设置为 1。
    • @AviBerger 0x1FF 只有 9 位?
    • 对,我的错。我回去编辑了那条评论。
    • @AviBerger 再次感谢;我添加了一些关于 0 和 1 位的更多解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2015-07-28
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多