概括:
我正在寻找最快的计算方法
(int) x / (int) y
没有例外y==0
。相反,我只想要一个任意的结果。
背景:
在编码图像处理算法时,我经常需要除以(累积的)alpha 值。最简单的变体是带有整数运算的纯 C 代码。我的问题是,对于结果像素,我通常会得到除以零的误差alpha==0
。然而,这正是结果无关紧要的像素:我不关心像素的颜色值alpha==0
。
细节:
我正在寻找类似的东西:
result = (y==0)? 0 : x/y;
或者
result = x / MAX( y, 1 );
x 和 y 是正整数。代码在嵌套循环中执行了很多次,所以我正在寻找一种方法来摆脱条件分支。
当 y 不超过字节范围时,我对解决方案感到满意
unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 };
[...]
result = x / kill_zero_table[y];
但这显然不适用于更大的范围。
我想最后一个问题是:将 0 更改为任何其他整数值,同时保持所有其他值不变的最快位旋转黑客是什么?
澄清
我不是 100% 肯定分支太贵了。但是,使用了不同的编译器,所以我更喜欢几乎没有优化的基准测试(这确实是有问题的)。
可以肯定的是,编译器在位旋转方面非常出色,但我无法在 C 中表达“不关心”的结果,因此编译器将永远无法使用全部优化。
代码应该完全兼容 C,主要平台是带有 gcc 和 clang 的 Linux 64 位和 MacOS。