【发布时间】:2017-10-09 13:20:29
【问题描述】:
我有一组 22 个 5 位值 (0-31),它们作为 110 位打包在一起,形成两个 64 位无符号整数(即最后 18 位始终为零)。我想设计一个函数,对于每个 5 位段,执行绝对值差。
我知道对单个数字使用按位运算符的减法方法,但在这里我不想担心 5 位段之间的溢出。我正在寻找使用按位运算符和/或 x86 汇编操作的解决方案,最好没有任何循环。
编辑:为了澄清,我将有一对这 110 位我想对它们进行差异操作。欢迎提出任何建议。
解决方案:感谢 @EOF 建议 VPSADBW 指令。我将使用 8 位数字来代替更快(更易读)的代码。
【问题讨论】:
-
你能澄清一下 - 单个值的绝对值差异是多少? (我只知道 两个 值之间的区别。)
-
它看起来像一个“我的代码”请求。
-
我怀疑最讨厌的部分将是跨越两个
uint64_ts 的 5 位数字。 -
@EOF 我有一个非常好的方案,但我的 1 正好是 1 位。我在考虑给每个 6 位并使用 1 位进行进位。这样在减法之前我们可以设置所有进位和减法。但这将需要 66 位。我们只有 64 + 1(实际进位)= 65 位。
-
@WillCunningham:嗯,x86 上有
[V]PSADBW,它为您提供了uint8_ts 的两个向量之间绝对差的总和。我认为 x86 本身没有绝对差异的指令,但 ARM NEON 有:VABD。在 x86 上,您可能需要两条指令,[V]PSUBB和[V]PABSB。
标签: c optimization x86 bit-manipulation x86-64