由C、C++中的位移位运算符(<<,>>)移位的位

Bits shifted by bit shifting operators(<<, >>) in C, C++

本文关键字:gt lt 运算符 C++      更新时间:2023-10-16

我们可以访问C,C++中由位移位运算符(<<,>>)移位的位吗?例如:23>>1我们能访问最后一个移位的比特吗(在这种情况下是1)?

否,移位运算符只给出移位后的值。您需要执行其他逐位操作来提取从值中移出的位;例如:

unsigned all_lost  = value & ((1 << shift)-1);  // all bits to be removed by shift
unsigned last_lost = (value >> (shift-1)) & 1;  // last bit to be removed by shift
unsigned remaining = value >> shift;            // lose those bits

通过使用23>>1,位0x01被清除-您无法在位移位后检索它。

也就是说,没有什么能阻止你在移位前检查位

int  value   = 23;
bool bit1    = value & 0x01;
int  shifted = value >> 1;

您可以在移位之前访问位,例如

value  = 23;          // start with some value
lsbits = value & 1;   // extract the LSB
value >>= 1;          // shift

值得注意的是,在MSVC编译器上存在一个内部函数:_bittest

这加快了操作速度。