假设我有一个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);