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

ula*_*ade 2 c++ bit-manipulation bitwise-operators

假设我有一些32位整数:

000001010100010000100010001001 1 0

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

所以,如果我将它向右移动2,我得到:

00000001010100010000100010001001

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

Mik*_*our 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;
Run Code Online (Sandbox Code Playgroud)

或者,如果你喜欢简洁:

value = ((value >> shift) & ~mask) | (value & mask);
Run Code Online (Sandbox Code Playgroud)

  • @JamesKanze:基本的阅读理解.这改变了位而不改变其中一个,正如问题描述的那样. (2认同)