如何将三个 4 位有符号整数(即 5 位)打包成一个 16 位整数?

Sam*_*ley 3 c c++ bit-manipulation packing bit-shift

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

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

如果可能的话,请给我的代码打包解压。

谢谢

JDł*_*osz 9

struct s {
   int16_t x : 5;
   int16_t y : 5;
   int16_t z : 5;
};
static_assert (sizeof(s) == sizeof(int16_t));
Run Code Online (Sandbox Code Playgroud)

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

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

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