Aquí hay una versión C riffs fuera de la solución en el puesto pregunta, pero soluciona el caso en el que todos los valores son MAXINT ...
int foo(int value1, int value2, int value3)
{
int value1Temp, value2Temp, value3Temp, tempMax;
value1Temp = max(value1, 0);
value2Temp = max(value2, 0);
value3Temp = max(value3, 0);
tempMax = value1Temp | value2Temp | value3Temp;
if (value1Temp == 0) { value1Temp = tempMax; }
if (value2Temp == 0) { value2Temp = tempMax; }
if (value3Temp == 0) { value3Temp = tempMax; }
return min(value1Temp, min(value2Temp, value3Temp));
}
También es posible hacer esto de una manera libre de rama así, desde el mínimo y el máximo pueden ser implementados como operaciones libres de la rama:
int min(int x, int y)
{
return y + ((x - y) & -(x < y));
}
int max(int x, int y)
{
return x - ((x - y) & -(x < y));
}
int foo(int value1, int value2, int value3)
{
int value1Temp, value2Temp, value3Temp, tempMax, mask;
value1Temp = max(value1, 0);
value2Temp = max(value2, 0);
value3Temp = max(value3, 0);
tempMax = value1Temp | value2Temp | value3Temp;
mask = -(value1Temp > 0);
value1Temp = (value1Temp & mask) | (tempMax & ~mask);
mask = -(value2Temp > 0);
value2Temp = (value2Temp & mask) | (tempMax & ~mask);
mask = -(value3Temp > 0);
value3Temp = (value3Temp & mask) | (tempMax & ~mask);
return min(value1Temp, min(value2Temp, value3Temp));
}
para obtener más antecedentes sobre por qué usted quiere nunca hacer esto, vea: Is "If" Expensive? y Bit Twiddling Hacks.
Editar: Acabó mi intento anterior de una solución sin ramificación, que en realidad no funcionó. Se agregó una nueva solución libre de ramificaciones que debería funcionar.
Su código no funciona cuando los tres elementos son todos MaxInt. – pyon
Buen punto. Podría verificar si los tres valores son ceros y regresar antes si lo están (pero sé que no van a ser MaxInt). – Ray
Si los tres valores son MaxInt, MaxInt es el menor valor positivo distinto de cero en la lista ... ¿no? –