如何用一行代码设置和清除不同的位(C)

How to set and clear different bits with a single line of code (C)

data |= (1 << 3) 设置位 (3) 而不破坏其他位。 data &= ~(1 << 4) 重置位 (4) 而不中断其他位。如何在一条指令中完成这两项任务?

(因为这实际上只是为了提高可读性,我计划 #define 以一种像 #define gpioHigh(x) <insert code> 这样可爱的方式来处理它。另一种方法是弄清楚如何正确地将 gpio 指针传递给函数我专门为此目的而写的,但有效)

谢谢!

麦克

单条指令是不可能的。这是因为您需要对不同的位执行 3 种可能的操作:

  • 设置它们(位 3)
  • 清除它们(位 4)
  • 别管他们(所有其他位)

如何使用由二进制数字组成的位掩码从三种可能性中选择一种select?

当然,你可以用一行来完成 e.g:

data = (data | (1 << 3)) & ~(1 << 4)

你不能。

也就是说,如果您想明确确保设置 bx 并清除 by - 如果您只是想翻转它们(无论先前的值如何),您可以与 operator^ 正如其他人指出的那样。

要了解为什么这不能在一条指令中完成(当然,您可以轻松地将两条或更多条指令组合成一条 LOC),请考虑以下事实 table:

B|A|Q
-----
0|0|x
0|1|0
1|0|1
1|1|x

其中 "don't care" x 与讨论无关。没有逻辑运算符具有此功能 - 怎么可能呢?如果两个输入的值不同*,我们如何确定哪个是 B 哪个是 A?这是你问题的核心。

但是,请考虑将其塞入一条指令中可能无论如何都无法实现您声明的可读性目标。事实上,如果有的话,两者分开是 更多 可读 - 并且仍然可以被一些 set3clear4().

调用

注意 - 这与切线相去甚远 - 事实 table 可以通过所谓的 'Logic Elements' 在 FPGA 架构中实现,因为它们是由 'look-up tables' 构建的(LUT)本质上是 ROM,其中输入 A,B,... 索引到 table 以找到值 Q。当然,A¬B 对应的地址不同于 ¬AB.