有没有办法从一个未知字节 set/clear 位,同时保持所有其他位不变?

Is there a way to set/clear a bit from an unknown byte whilst leaving all other bits unchanged?

我想写入寄存器。

寄存器保存1个字节的信息。为了争论,我想更改第 6 位。

我现在完成此操作的方法是读取寄存器,然后执行 set/clear。

这样我只改变我感兴趣的位,其余的保持不变。

例如:

// Read register
uint8_t reading = read_reg(0x00);

// Set 6th bit
if (wanting_to_set) { reading |= (1 << 6); }
if (wanting_to_reset) { reading &= ~(1 << 6); }

// Write back to register
write_reg(0x00, reading);

有没有办法在不知道字节是什么的情况下设置或重置第 n 位?这样我就可以避免先读取寄存器。

Is there a way I can set or reset the nth bit without knowing that the byte is? This way I can avoid having to read the register first.

在 C 中没有执行此类操作的标准方法。即使您的机器具有可单独寻址的位,C 语言也没有定义任何以小于 8 位为单位访问内存的方法,无论底层硬件的功能如何。

因此,在标准 C 中,如果要修改单个位而不修改附近的任何其他位,则必须同时用与它们相同的值覆盖该位附近的至少 7 个位来完成此操作已经有。这意味着您必须要么拥有这些位的当前值,要么不关心写入它们的值是什么。

作为对@John 回答的补充:

非常流行的 ARM Cortex-M(3,4) uC 具有位带内存区域。该区域中的所有位均可单独寻址。所以你可以通过简单的resing或写入该地址来简单地读取或写入一位。