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

convert uint8 and uint32 variables to one uint64

我有以下变量。

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

谢谢

怎么样:

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

这会将 8 位字段 "above" 放入 32 位字段,即返回的 uint64_t 的位排列如下:

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

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

我会把 convertBack()(这是一个非常糟糕的名字,这两个名字都不是最佳的)留给你。 :)

您可以组织 64 位整数:

  • 低8bit为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;
}