我想在不影响其他位的情况下替换 32/64 位数据字段中的位/位(不止一个)。比如说:
我有一个 64 位寄存器,其中第 5 位和第 6 位可以取值 0、1、2 和 3。
5:6
---
0 0
0 1
1 0
1 1
现在,当我读取寄存器时,我得到值 0x146 (0001 0 10 0 0110)。现在我想将位位置 5 和 6 的值更改为 01。(现在是 10,十进制为 2,我想将其替换为 1 e 01)而不影响其他位并写回寄存器只修改了第 5 位和第 6 位(因此更改后变为 126)。
我试过这样做:
reg_data = 0x146
reg_data |= 1 << shift // In this case, 'shift' is 5
如果我这样做,位位置 5 和 6 的值将变为 11 (0x3),而不是我想要的 01 (0x1)。
- 我如何着手进行读取、修改和写入?
- 如何使用 C 仅替换 32/64 位字段中的某些位或多个位而不影响该字段的整个数据?
设置一点还可以,但是超过一点,我觉得有点困难。
最佳答案
使用位掩码。有点像:
new_value = 0, 1, 2 or 3 // (this is the value you will set in)
bit_mask = (3<<5) // (mask of the bits you want to set)
reg_data = (reg_data & (~bit_mask)) | (new_value<<5)
这会保留旧位和新位中的 OR。
关于c - 如何使用 C 在不影响其他位的情况下替换位域中的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5925755/