c - 有没有办法从未知字节中设置/清除一个位,同时保持所有其他位不变?
问题描述
我想写一个寄存器。
该寄存器保存 1 个字节的信息。为了争论,我希望更改第 6 位。
我现在完成此操作的方法是读取寄存器,然后进行设置/清除。
这样我只更改我感兴趣的部分,其余部分保持不变。
例如:
// 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 位?这样我就可以避免必须先读取寄存器。
解决方案
有没有办法在不知道字节是什么的情况下设置或重置第 n 位?这样我就可以避免必须先读取寄存器。
在 C 中没有标准的方法来执行这样的事情。即使您有一台具有单独可寻址位的机器,C 语言也没有定义任何以小于 8 位为单位访问内存的方法,无论功能如何的底层硬件。
因此,在标准 C 中,如果您想修改单个位而不修改附近的任何其他位,那么您必须同时用它们已经具有的相同值覆盖该位附近的至少七个位来完成它。这意味着您必须要么拥有这些位的当前值,要么不在乎写入了哪些值。
推荐阅读
- python - 使用列表中的值作为索引值来创建新的多维数组
- mysql - 哪种运输方式的延迟订单数量最多
- excel - 加载带有换行符的 CSV
- c++ - 如果我们从派生类的指针中调用一个成员函数,该指针指向基础对象怎么办?
- python - 我有一个 DataFrame,需要在列之间执行计算。我的函数 do_something 可以向量化吗?
- flutter - 如何使用 streamController 来 Flutter 推送通知?
- vue.js - 为什么 'this.count++' 与 Vue3 中的 'count.value++' 工作方式相同?
- kotlin - java.lang.ExceptionInInitializerError:我的世界 kotlin 插件中的 null
- import - 如何导入pypdf2?
- javascript - 如何使用reactjs突出显示texarea文本中最常见的字符?