【问题标题】:Remove/Shift n unused bits from uint8_t [duplicate]从 uint8_t 中删除/移动 n 个未使用的位 [重复]
【发布时间】:2022-05-10 09:45:46
【问题描述】:

我正在从实时计数器中读取秒作为 BCD 数据,第 7 位不用于此。

使用类似的在线示例,我能够将uint8_t BCD 数据转换为人类可读的 (0 - 59) 秒。

#define PCF8563_BCD_LOWER_MASK 0x0f
#define PCF8563_BCD_UPPER_MASK_SEC 0x70
#define PCF8563_BCD_UPPER_SHIFT 4

uint8_t raw_seconds = get_raw_seconds();
int seconds = (raw_seconds & PCF8563_BCD_LOWER_MASK) + (((raw_seconds & PCF8563_BCD_UPPER_MASK_SEC) >> PCF8563_BCD_UPPER_SHIFT) * 10);

我想对分钟、小时等做同样的事情(它们也都是 BCD 格式)。我觉得我知道该怎么做;移位/删除第 7 位(几分钟)并将 BCD 转换为十进制 - 但我无法弄清楚如何在代码中执行此操作。

从 BCD 转换为十进制并不是问题(有一个功能),未使用位的移位/删除让我失望。

  • 您想删除(或者更确切地说,忽略)第 7 位并保留第 6-0 位。考虑哪个位掩码可以实现这一点。你不需要改变任何东西。
  • @mkrieger1 这正是我所需要的,谢谢。澄清代码我的问题是从其他示例中组合起来的,我无法弄清楚它是如何工作的。位掩蔽是我一直在寻找的 - 我正在寻找错误的东西。

标签: c bit-manipulation bitwise-operators


【解决方案1】:

感谢@mkrieger1 的评论,我研究了位掩码,解决方案非常简单。

对于小时和分钟,位掩码 0x7f/01111111 用于仅保留前 7 位,而如果您只需要 6 位,则只需使用 0x3f/00111111 等。代码保持不变,但面具改变了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2022-01-14
    • 2017-11-30
    • 2016-10-01
    • 2020-10-09
    相关资源
    最近更新 更多