Есть ли неразветвляющееся побитовое решение для определения числа "нечетное число из 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 привести к переполнению или недостаточному заполнению, это неопределенное поведение. может использовать переменные без знака.

Другие вопросы по тегам