c++:如何将 uint32 中的相关位放入 uint8?

c++: how to put relevant bits from uint32 into uint8?

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

但是有没有一种奇特的按位运算,我可以使用它来一次性传输位,而无需循环?

为什么不直接屏蔽最后 8 位,而不是 运行 循环查看是否设置了各个位?

const unsigned char bitMask = 0xFF;
j = (i & bitMask);

请注意,尽管 C++ 14 允许您立即定义二进制文字

const unsigned char bitMask = 0b1111'1111;

以上就是你所需要的。以防万一,如果您需要获取后续字节位置,请使用相同的掩码 0xFF 并确保向后右移结果以获得所需的字节值。

您只需将 uint32 值分配给 uint8 即可获得相同的结果。

int main()
{
  unsigned int i = 0x00000888;
  unsigned char j = i;
  cout<<hex<<i<<endl;
  cout<<hex<<+j<<endl;
  return 0;
}

输出: 888 88