无枝饱和
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
我有以下计算:
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