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

时间:2016-06-16 13:00:07

标签: c bit-shift uint64 uint8t uint32

我有以下变数。

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 个答案:

答案 0 :(得分:4)

怎么样:

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

这使得8位字段&#34;高于&#34; 32位的,即返回的uint64_t的位数如下:

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

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

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

答案 1 :(得分:0)

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

  • flags的低8位,

  • 关注token

  • 的32位

所以,

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;
}