代码之家  ›  专栏  ›  技术社区  ›  Dan The Man

将uint8和uint32变量转换为一个uint64

  •  1
  • Dan The Man  · 技术社区  · 8 年前

    我有以下变量。

    uint8_t flags;
    uint32_t token;
    

    我需要编写将它们合并到一个uint64_t中的函数,然后将它们解析回两个变量,一个是uint8_t,另一个是uint32_t。

    uint64 convert(uint8_t flags, uint32_t token);
    void convertBack(uint64 allTogether, uint8_t* flags, uint32_t* token);
    

    我试图找到一些可以执行以下操作的方法,但我发现大多数方法都是将两个相同的转换为一个更大的,比如将两个uint32_t转换成一个uint64_t

    非常感谢。

    2 回复  |  直到 8 年前
        1
  •  4
  •   unwind    8 年前

    怎么样:

    uint64_t convert(uint8_t flags, uint32_t token)
    {
      return ((uint64_t) flags << 32) | token;
    }
    

    这将8位字段置于32位字段之上,即返回的 uint64_t 其位排列如下:

     +---------------------------------+--------------------------------+
     |666655555555554444444444|33333333|3322222222221111111111          |
     |321098765432109876543210|98765432|10987654321098765432109876543210|
     +------------------------+--------+--------------------------------+
     |        unused(24)      |flags(8)|          token(32)             |
     +------------------------+-----------------------------------------+
    

    十进制位数应向下读取,位0位于最右侧(LSB)。

    我要走了 convertBack() (这是一个非常糟糕的名字,这两个名字都是次优的)

        2
  •  0
  •   artm    8 年前

    您可以使用以下内容组织64位整数:

    • 低8位,用于 flags ,

    • 以下32位用于 token

    所以

    uint64_t convert(uint8_t flags, uint32_t token)
    {
        return ((uint64_t)token << 8) | flags;
    }
    

    把它换回来

    void convertBack(uint64_t allTogether, uint8_t* flags, uint32_t* token)
    {
        *flags = allTogether & ~( ~0UL << 8 );
        *token = allTogether >> 8;
    }