data | =(1 <3)设置位(3)而不中断其他位。 data&amp; =〜(1 <&lt; 4)重置位(4)而不中断其他位。如何在一条指令中完成这两项任务?
(…
在单个指令中不可能。这是因为您需要对不同的位执行3种操作:
如何使用由二进制数字组成的位掩码从三种可能性中选择一种?
当然,你可以用一行来做,例如:
data = (data | (1 << 3)) & ~(1 << 4)
你不能。
也就是说,如果你想明确保证 bx 设置和 by 清除 - 如果你只是想翻转它们(不管先前的值),你可以与XOR一起使用 operator^ 正如其他人所指出的那样。
bx
by
operator^
要了解为什么在一条指令中无法完成此操作(当然,您可以轻松地将两条或更多条指令组合到一个LOC中),请考虑以下真值表:
B|A|Q ----- 0|0|x 0|1|0 1|0|1 1|1|x
哪里“不在乎” x 与讨论无关。没有逻辑运算符具有此功能 - 它怎么可能?我们怎样才能确定哪个是 B 哪个是 A 如果两个输入值不同*?这是问题的核心。
x
B
A
但是,考虑到将这个塞入一条指令可能无法实现您所述的可读性目标。事实上,如果有的话,两者分开 更多 可读 - 并且仍然可以被某些人调用 set3clear4() 。
set3clear4()
注意 - 这与切线相关 - 真值表可以通过FPGA体系结构中的所谓“逻辑元素”来实现,因为它们是从“查找表”(LUT)构建的,基本上是ROM输入 A,B,... 索引进入表中查找值 Q 。而且当然, A¬B 对应于不同的地址 ¬AB 。
A,B,...
Q
A¬B
¬AB