J0E Все-таки существует разница между операцией сравнения "!=" (не равно) и операцией логического НЕ "!", которая только эквивалентна сравнению с нулем, иначе можно дойти до того, чтобы назвать операцию побитовое И "&" циклом с набором побитовых сравнений. google Пусть решит автор темы.
Стандарт пишет: "The expression !E is equivalent to (0==E)." == запрещено Так можно дойти, что equivalent это не "равноценный, равнозначащий; равносильный; равнозначный, эквивалентный"
J0E В таком случае получается, что нельзя использовать логические операции И "&&", ИЛИ "||", которые также производят сравнение с нулем. Следующие решения не проходят это ограничение: Код (Text): a*=((a^b) || 0) a*=((a^b) && 1) a&=-((a^b) || 0) a&=-((a^b) && 1)
Спасибо всем отписавшимся. Попробую точнее сформулировать. Смысл вопроса был в том, что надо избежать любых логических операций (>, < , ==, !=), которые неминуемо порождают ветвления (я не имею ввиду явную форму), что может привести к сбросу конвеера. И интересно было именно решение на С, т.к. будет действительным для большего количества архитектур ) Вариант от google Код (Text): a &= ((signed)((a-b) | (b-a)) >> sizeof(a)*8) отлично выполняет условия. Вариант от skomarov элегантен, Код (Text): a &= (!(a^b)-1); но не выполняет основной задачи. С такиж же успехом можно писать и a = (a == b ? 0 : a), и a *= (a != b), и так далее.
Ation - там ошибка, надо (sizeof(a)*8-1) Возникает вопрос, а чего тогда сразу не написать: Код (Text): mov ebx, [a] xor eax, eax cmp ebx, [b] movne eax, ebx х86 не единственная в мире, и далеко не на всех архитектурах есть аналоги SETcc и MOVcc.
Да, ведь это явное ветвление, в силу ленивости операций. Но они и не нужны, можно обойтись чистой арифметикой, см вариант google который отлично понял что я имел ввиду в первом посте (хотя может и не смотрел его). А еще "потенциально нельзя" использовать другие команды, которые могут давать ложные зависимости по данным (MOVcc, SBB) не понятно почему автора темы волнует исключительно сброс конвейера, раз он считает себя умнее компилятора.