我有以下变数。
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
谢谢
答案 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
所以,
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;
}