【问题标题】:c++: how to put relevant bits from uint32 into uint8?c ++:如何将uint32中的相关位放入uint8?
【发布时间】:2018-12-05 03:31:22
【问题描述】:

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

但是有没有一种奇特的按位运算可以让我一举将位传输过来,而无需循环?

【问题讨论】:

    标签: c++ bit-manipulation mask bit


    【解决方案1】:

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

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

    输出: 888 88

    【讨论】:

    • 哇,我真的想多了……直接转换为 unsigned char 似乎可行!
    【解决方案2】:

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

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

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

    const unsigned char bitMask = 0b1111'1111;
    

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

    【讨论】:

    • 或者你可以像 j |= i 一样将它们组合在一起(假设 j 设置为 0)虽然我不确定这是否会引发警告,因为它会转换为更小的类型,但是以上也是。
    • @Yastanub:是的,公平点。我认为不会引发警告。
    • 您不需要位掩码,因为您正在转换为较小的类型。尽管为了获得良好的风格,您应该使用正确的 static_cast。
    猜你喜欢
    • 2017-02-20
    • 1970-01-01
    • 2017-03-11
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多