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