gpt4 book ai didi

c - 将 int16_t 存储在 uint64_t 中

转载 作者:行者123 更新时间:2023-11-30 14:54:25 25 4
gpt4 key购买 nike

所以我有 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),两个输出相差 1。

我会注意到,我尝试首先将 int16_t 转换为 uint16_t(添加 32768),但没有成功。

最佳答案

您将从一个数字进位到下一个数字。与将十进制数 19 编码为 1923 完全相同23,然后将它们加在一起:19 + 23 = 42,但是 1 + 2 = 3。所以最高位数字“相差一位”。

即使您想避免完全解压,您仍然可以执行以下操作:

result = 
((a&0xffff0000ffff0000 + b&0xffff0000ffff0000) & 0xffff0000ffff0000) |
(a&0x0000ffff0000ffff + b&0x0000ffff0000ffff) & 0x0000ffff0000ffff))

...分两步操作以避免不当携带。

关于c - 将 int16_t 存储在 uint64_t 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46750473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com