我们说我有一些32位整数:
000001010100010000100010001001 1 0
(倒数第二位是粗体/斜体)
因此,如果我将它向右移动2,我得到:
00000001010100010000100010001001
现在倒数第二位丢失了。 我想过存储原始值然后使用|| (逻辑或),但只有在倒数第二位设置为1时才会起作用。如果它是0,该怎么办?
答案 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);