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 = 0xF000
和 y = 0x2000
。
我有一个需要操作的 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 = 0xF000
和 y = 0x2000
。