Sam*_*ley 3 c c++ bit-manipulation packing bit-shift
我想将 3 个有符号的 4 位整数(4 位数据,1 位符号位)打包成一个 16 位整数,但我不知道该怎么做或从哪里开始:(
我需要用尽可能少的数据来表示 3D 网格中的位置(由于网格尺寸较大,它确实加起来了)。如果有帮助,我正在使用 GLM(OpenGL 数学库,因此我可以访问诸如glm::sign())
如果可能的话,请给我的代码打包和解压。
谢谢
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将确保它真正做到了您的意图,所有字段只使用一个词。我听说过的用于传统平台的所有编译器都会按预期打包。