Это не эффективно и медленнее на многих архитектурах, чем "нормальный" способ.Я должен также упомянуть, что он не читается и очень подвержен ошибкам.
пример:
int foo(int x, int y)
{
return (y + ((x - y) & ((x - y) >>(sizeof(int) * CHAR_BIT - 1))));
}
int foo1(int x, int y)
{
return x > y ? y : x;
}
и полученный код (ARM Cortex):
foo:
sub r0, r0, r1
and r0, r0, r0, asr #31
add r0, r0, r1
bx lr
foo1:
cmp r0, r1
movge r0, r1
bx lr
илиx86
foo:
sub edi, esi
mov eax, edi
sar eax, 31
and eax, edi
add eax, esi
ret
foo1:
cmp edi, esi
mov eax, esi
cmovle eax, edi
ret