c - 如何使用 C 在不影响其他位的情况下替换位域中的位

标签 c bit-manipulation

我想在不影响其他位的情况下替换 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/

相关文章:

c++ - 一种直接根据掩码转位的方法

java - 从另一个号码获取不太具体的号码

c - 如何从存储在字节数组中的字节中检索值?

c - 删除 C 中的部分字符串(正则表达式?)

c - 如何从文件中读取数字以获取c中的大小

c - c 中的素数和立方和

c - 显示 n 次单位根的程序(C 编程)

java - 登录 Java 的最快方法是什么?

二维数组的正确下标排序

c# - 按位与如何与 bool 值交互?