通过位移操作替换分支语句

时间:2010-02-24 21:38:54

标签: algorithm bit-manipulation bit-shift conditional-statements

我正在编写一个图像二值化算法,它只是将每个像素的亮度值(灰度图像)转换为黑色或白色。目前,用于二值化每个像素的算法大致是这个

if( grayscale[x] < thresholdValue)
{
bitonal[x] = 1;
}

(这实际上是ACTUAL算法的简化,因为双色调图像实际上是一个bitpacked图像(每个数组索引保持8个像素)所以我实际上在当前数组索引中对1进行bitpack ...但我不认为这改变了我的问题。

我正在尝试做的是删除对if语句的需要。

我在想的是按照这个方针做点什么。通过灰度减去thresholdValue,然后执行一些位操作技巧以清除或移位位,以便(grayscale[x]-threshold) is less than 0, I get a 0. otherwise I would get a 1的结果。如果它更容易做到(if grayscale[x]-threshold < 0 + bitwise trickery get a 1, else get a 0)的另一种方式,也可以工作......只要我可以摆脱分支语句...任何帮助赞赏..

5 个答案:

答案 0 :(得分:8)

bitonal[x] = (grayscale[x] < thresholdValue);

答案 1 :(得分:4)

如果亮度为8位值,那么您可以拥有256个元素的数组,其中包含0或1(数组的第一个阈值元素包含1,以及其余元素包含0

bitonal[x] = array[grayscale[x]];

答案 2 :(得分:4)

我刚刚在嵌入式应用中查看类似的时间关键时刻循环。 我发现一件有趣的事情是像这样的代码

bit = (a<b);

仍在我的平台上生成分支指令(TI F2812)。似乎编译器没有直接的方法将状态标志从比较移动到寄存器,所以它生成类似

的东西
 temp_register =  0
 cmp a,b
 branch to label if LT
 temp_register = 1
label:
 bit = temp_register

但是,处理器确实有内置的max和min运算符。由于分支非常昂贵,因此这段代码实际上运行得更快:

bit = min(max((b-a),0),1);

如果&lt; maxmin的结果将仅为非零。湾然后{{1}}会将任何非零值转换为1。

这是特定于处理器的,可能根本不适用于X86。

答案 3 :(得分:0)

您使用的是哪种语言?该语言是否具有最小/最大功能? (例如C ++和Java都这样做)如果语言有,那将是一种消除if的方法......例如Min(灰度[x]&lt; thresholdValue,0)

答案 4 :(得分:0)

也许:

bitonal[x] = ((grayscale[x] - thresholdValue) >> 31) xor 1;

假设您的语言不等于布尔值和整数值(如C和C ++那样)。