Есть ли неразветвляющееся побитовое решение для определения числа "нечетное число из 3", если два равны, иначе первое?
int64_t foo(int64_t a, int64_t b, int64_t c){
return a == b ? c : a == c ? b : a;
}
Есть ли какой-нибудь неразветвленный битовый хак, который реализует функцию выше?
1 ответ
Решение
Да, это:
return ((!(a-b))*(c^a))^((!(a-c))*(b^a))^a;
if a=b=c: (1*(c^a))^(1*(b^a))^a = a^b^c= a
if a=b != c: then (1*(c^a))^0^a= c^a^a= c
то же самое для a=c != b
if a != b != c: (0*(a^c))^(0*(a^b))^a = 0^0^a=a
сомнительно, если этот способ быстрее, но попробуйте.
UB-Предупреждение. если a-b
или же a-c
привести к переполнению или недостаточному заполнению, это неопределенное поведение. может использовать переменные без знака.