将 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;
}
我有以下变量。
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;
}