将 int16_t 存储在 uint64_t 中
Storing int16_t's in uint64_t's
所以我有 4 个 uint16_t,我试图将它们存储在一个 uint64_t 中。我想我有那个工作。
uint64_t encode(int16_t A, int16_t B, int16_t C, int16_t D){
return (uint64_t)((uint16_t) A) << 48
| (uint64_t)((uint16_t) B) << 32
| (uint64_t)((uint16_t) C) << 16
| (uint64_t)((uint16_t) D) << 0;
}
int main(){
int16_t A1 = -32000;
int16_t B1 = -31000;
int16_t C1 = 16004;
int16_t D1 = 16007;
uint16_t A2 = 32000;
uint16_t B2 = 15000;
uint16_t C2 = -4;
uint16_t D2 = -7;
uint64_t E = encode(A1, B1, C1, D1)
+ encode(A2, B2, C2, D2);
printf("%d\n", (int16_t)((E >> 48)));
printf("%d\n", (int16_t)((E >> 32)));
printf("%d\n", (int16_t)((E >> 16)));
printf("%d\n", (int16_t)((E >> 0)));
}
我已经能够对 4 int16_t 进行编码,然后使用此方法将它们取回。现在,我想把两个编码形式加在一起,解码它们,然后回到原来的操作。我似乎因 1 个错误而被淘汰。
我这里输出的是0、-15999、16001、16000。
两个输出正确(0 和 16000),两个相差一个。
我会注意到,我曾尝试先将 int16_t 转换为 uint16_t(添加 32768),但没有成功。
您正在从一个号码进位到下一个号码。完全一样,如果你将十进制数 1
和 9
编码为 19
,2
和 3
为 23
然后将它们加在一起: 19 + 23 = 42
,但 1 + 2 = 3
。所以最上面的数字是'off by one'.
即使你想避免完全解包,你仍然可以这样做:
result =
((a&0xffff0000ffff0000 + b&0xffff0000ffff0000) & 0xffff0000ffff0000) |
(a&0x0000ffff0000ffff + b&0x0000ffff0000ffff) & 0x0000ffff0000ffff))
...分两步操作以避免不当进位。
所以我有 4 个 uint16_t,我试图将它们存储在一个 uint64_t 中。我想我有那个工作。
uint64_t encode(int16_t A, int16_t B, int16_t C, int16_t D){
return (uint64_t)((uint16_t) A) << 48
| (uint64_t)((uint16_t) B) << 32
| (uint64_t)((uint16_t) C) << 16
| (uint64_t)((uint16_t) D) << 0;
}
int main(){
int16_t A1 = -32000;
int16_t B1 = -31000;
int16_t C1 = 16004;
int16_t D1 = 16007;
uint16_t A2 = 32000;
uint16_t B2 = 15000;
uint16_t C2 = -4;
uint16_t D2 = -7;
uint64_t E = encode(A1, B1, C1, D1)
+ encode(A2, B2, C2, D2);
printf("%d\n", (int16_t)((E >> 48)));
printf("%d\n", (int16_t)((E >> 32)));
printf("%d\n", (int16_t)((E >> 16)));
printf("%d\n", (int16_t)((E >> 0)));
}
我已经能够对 4 int16_t 进行编码,然后使用此方法将它们取回。现在,我想把两个编码形式加在一起,解码它们,然后回到原来的操作。我似乎因 1 个错误而被淘汰。
我这里输出的是0、-15999、16001、16000。 两个输出正确(0 和 16000),两个相差一个。
我会注意到,我曾尝试先将 int16_t 转换为 uint16_t(添加 32768),但没有成功。
您正在从一个号码进位到下一个号码。完全一样,如果你将十进制数 1
和 9
编码为 19
,2
和 3
为 23
然后将它们加在一起: 19 + 23 = 42
,但 1 + 2 = 3
。所以最上面的数字是'off by one'.
即使你想避免完全解包,你仍然可以这样做:
result =
((a&0xffff0000ffff0000 + b&0xffff0000ffff0000) & 0xffff0000ffff0000) |
(a&0x0000ffff0000ffff + b&0x0000ffff0000ffff) & 0x0000ffff0000ffff))
...分两步操作以避免不当进位。