В следующем коде используется прием, который, поскольку x
равен 1 или 0, x-1
равен 0 или -1 (например, 0xFFFFFFFF, предполагая 32-битное целое число: с). Если x
равно 1, результат &
равен нулю, поэтому результат равен a
. Когда x
равно нулю, результат &
будет b-a
, тогда общий результат будет a+(b-a)
или просто b
.
int test(int x, int a, int b)
{
return a + ( (((unsigned int)x)-1) & (b - a) );
}
На фиктивном микроконтроллере (без каких-либо необычных инструкций условного перемещения) это приведет к четырем инструкциям:
ADD #-1 R12
SUB R13, R14
AND R14, R12
ADD R13, R12
Правда, это очень похоже на решение XOR, опубликованное @ 6502.