在不改变C ++倒数第二位的情况下,将整数位移位?

时间:2014-08-21 16:16:15

标签: c++ bit-manipulation bitwise-operators

我们说我有一些32位整数:

000001010100010000100010001001 1 0

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

因此,如果我将它向右移动2,我得到:

00000001010100010000100010001001

现在倒数第二位丢失了。 我想过存储原始值然后使用|| (逻辑或),但只有在倒数第二位设置为1时才会起作用。如果它是0,该怎么办?

3 个答案:

答案 0 :(得分:9)

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

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);

答案 1 :(得分:4)

使用按位操作:

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

x>>2向右移动2.

& ~2将倒数第二位设为0

| (x&2)&#39;移植物&#39;在原始数字的倒数第二位。

答案 2 :(得分:0)

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