【问题标题】:Combining AND and OR bitwise operators结合 AND 和 OR 位运算符
【发布时间】:2020-12-17 15:37:22
【问题描述】:

为了安全地调整我使用的寄存器中的位:

DDRA  |= 0b01100000;
DDRA  &= 0b01111111;
  • 第一行将第 5 位和第 6 位设置为 TRUE,无论其当前状态如何,并且不会影响其他位
  • 第二行将设置第 7 位 FALSE,无论其当前状态如何,不会影响其他位

如何简化这两个操作?

【问题讨论】:

  • 为什么你认为这不是最简单的代码?
  • 如果您希望在一次写入中设置所有数据方向位 5,6,7,那么您可以使用DDRA = (DDRA & 0b00011111) | 0b01100000;
  • @EOF 因为可能有一种我不知道的更简单的写法
  • 你不能再简化它们了。
  • @Luc 在 c 中没有(基本上)更好的写法。在某些处理器架构上,存在三元向量逻辑运算(ARM 有vbsl 和朋友,x86-64 AVX512 有vpternlog),可以在单个处理器指令中执行此操作,但仅限于向量寄存器。此外,在任何相当现代的处理器上,只要编译器至少具备最低限度的能力,c 版本就会很快。

标签: c math binary


【解决方案1】:
DDRA = (DDRA << 1) >> 1;

上面的可能比上面的要快。

DDRA &= 0b01111111;

根据它是 8 位硬件寄存器(或 16 位硬件寄存器的 8 位子寄存器),DDRA 具有无符号数据类型,并且 CPU 的溢出标志和进位标志不会引起任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多