有人告诉我代码中的分支
int value = //some number;
if(value > some_other_value)
value *= 23;
else
value -= 5;
可以通过按位掩码消除(为了启用代码的 SIMD 优化):
const int Mask = (some_other_value-value)>>31;
value = ((value * 23)&Mask)|((value-5)&~Mask);
但是,我不明白这是如何工作的(即使我了解这里使用了哪些操作以及结果在二进制中的外观)。此外,这是否普遍适用?如果原始代码改为类似
if(value & 1 == 1)
value *= 23;
else
value -= 5;
删除分支的代码是否仍然相同?否则,面具的目的是什么,我应该如何去创造它?这里发生了什么?