首页 > 解决方案 > 如何将三个 4 位有符号整数(即 5 位)打包成一个 16 位整数?

问题描述

我想将 3 个带符号的 4 位整数(4 位数据,1 位符号位)打包成一个 16 位整数,但我不知道该怎么做或从哪里开始:(

我需要用尽可能少的数据来表示 3D 网格中的一个位置(因为网格尺寸更大,它真的加起来了)。如果有帮助,我正在使用 GLM(OpenGL 数学库,所以我可以访问诸如glm::sign()

如果可能,请给我打包和解包的代码

谢谢

标签: c++cbit-manipulationbit-shiftpacking

解决方案


struct s {
   int16_t x : 5;
   int16_t y : 5;
   int16_t z : 5;
};
static_assert (sizeof(s) == sizeof(int16_t));

打包和拆包是自动的:只需像其他任何struct. 例如 given s val;val.x=-17;packs 和foo(val.z);unpacks。

当您想将东西塞在一起以在程序本身中使用时,这很好,但不适用于文件格式之类的文档交换,因为(正如评论所指出的)它的打包方式是由实现定义的。

此外,这static_assert将确保它真正做到了您的意图,所有字段只使用一个词。我听说过的所有用于传统平台的编译器都会按预期打包。


推荐阅读