无枝饱和

Branch free saturation

我有以下计算:

 unsigned int a;
 unsigned b = (a < 4) ? a : 4;

是否可以将第二行转换为无分支格式?

谢谢!

试试这个:

  b = (a >= 4) * 4 + (a < 4) * ((a >> 1) & 1) * 2 + (a < 4) * (a & 1);

说明:如果 a >= 4,我们通过 "zeroing" 2 个最低有效位返回 4。如果 a < 4,我们使用这 2 个最低有效位。

您可以使用有条件应用的掩码:

unsigned int a, b, t, m;
t = a - 4;
m = 0 - ((int)t < 0); // mask of all 0s or all 1s
b = (t & m) + 4; // mask all 1s: b=a-4+4;  mask all 0s: b=4