C++如何改变一个32位数字中4位的值

C ++ How to change the value of 4 bits in a 32 bit number

我有一个需要操作的 32 位寄存器。但是我只需要更改第12-15位,其余位保持不变。

我想用 0x2 或 0b0010 覆盖位 12-15 中的任何内容。

我如何在 C++ 中执行此操作?

这是我一直在尝试的示例代码。

#include <iostream>
#include <bitset>

using namespace std;

int main() {
    uint32_t x = 0x4D00D0F0;

    x |= 0x2 << 12; // shifting 0x2 12 bits to the left

    return 0;
}

我的解决方案似乎只将 1 移到位 13,这是为什么?

我可以移动整个 4 位十六进制数吗?

底线,我想要 x = 0x4D0020F0

首先,屏蔽原始位以确保它们被归零并且不会干扰值,您将"or"那里:

x & 0xffff0fff

然后 "or" 新位就位:

(x & 0xffff0fff) | (0x2 << 12)

通常x = (x & ~mask) | (y & mask)mask位置的位从y复制到x

在 OP 的情况下 mask = 0xF000y = 0x2000