我有一个uint32,我在上面标记了一些位:
uint32 i = 0;
i |= (1 << 0);
i |= (1 << 5);
i |= (1 << 13);
i |= (1 << 19);
...
我想将其转换为uint8(通过获取其前8位的状态并忽略其余部分(。显然我可以做到:
uint8 j = 0;
for (int q = 0; q < 8; q++)
{
if (i & (1 << q))
{
j |= (1 << q);
}
}
但是,有没有一种奇特的逐位操作可以让我在没有循环的情况下一次性传输比特?
只需将uint32值分配给uint8即可获得相同的结果。
int main()
{
unsigned int i = 0x00000888;
unsigned char j = i;
cout<<hex<<i<<endl;
cout<<hex<<+j<<endl;
return 0;
}
输出:88888
为什么不屏蔽最后8位,而不是运行一个循环来查看是否设置了单个位?
const unsigned char bitMask = 0xFF;
j = (i & bitMask);
注意,C++14允许您立即定义二进制文字
const unsigned char bitMask = 0b1111'1111;
以上就是你所需要的。以防万一,如果您需要获得后续的字节位置,请使用相同的掩码0xFF
,并确保将结果右移回来以获得所需的字节值。