是否有一些小技巧可以有效地解压缩 16 位压缩 BCD 数字?
以步行方式执行此操作需要 10 次操作(3 个班次、4 个 AND 和 3 个 OR 或 ADD):
x = (bcd & 0xF000) << 12
| (bcd & 0x0F00) << 8
| (bcd & 0x00F0) << 4
| (bcd & 0x000F)
对于多路 ADD/OR,关键路径长度将为 3,但这些操作往往是二进制的,因此大多数 CPU 将查看长度为 4 的关键路径。
这可以更有效地完成吗?
注意:对于某些目的,如果可以特别有效地解包半字节的某些排列,例如如果要解包的单词来自我可以完全控制其创建的查找表(这样我可以将每个数字粘贴到任何地方),它可能同样有用我想)。在这种情况下使用打包而不是解包 BCD 的目的是将内存压力减半并避免超过 L1 缓存的大小,通过增加 CPU 的 ALU 上的负载来减轻过饱和的内存子系统的负载。
例如,如果我对 0x1324 之类的数字进行置换,那么简单的去交错会产生 0x01020304:
x = ((bcd << 12) | bcd) & 0x0F0F0F0F
这只是关键路径长度为 3 的三个操作,比原始版本有了很大的改进......