在c++中不改变倒数第二位的情况下移动整数中的位



假设我有一个32位整数:

000001010100010000100010001001 1 0

(倒数第二位为粗体/斜体)

如果向右移动2个单位,就会得到

00000001010100010000100010001001

现在倒数第二个位丢失了。我想存储原始值,然后使用||(逻辑或),但这只会在倒数第二个位被设置为1时起作用。如果是0呢?

您需要按位,而不是逻辑或;为了保留这个值,你需要在插入旧值之前清除新值中的位:

uint32_t const shift = 2; // number of bits to shift by
uint32_t const mask = (1 << 1); // set of bits to preserve
uint32_t bit_to_save = value & mask;
value >>= shift;
value &= ~mask;
value |= bit_to_save;

或者,如果你喜欢简洁的话:

value = ((value >> shift) & ~mask) | (value & mask);

使用按位运算:

(x>>2) & ~2 | (x&2)

x>>2右移2。

& ~2置倒数第二位为0

| (x&2) '接枝'在原编号倒数第二位

int x;//whatever
int penultimate_shift=(x&0x2)|((x>>2)&~0x2);

相关内容

最新更新