tgoop.com/the_algorithms/4789
Last Update:
Найти минимум или максимум между двумя числами без ветвлений
Иногда требуется найти минимум или максимум двух целых чисел, избегая использования ветвлений. Это может быть полезно на редких архитектурах, где ветвления являются очень дорогими операциями и отсутствуют инструкции условного перемещения.
Как это работает:
1. Побитовые операции: (x ^ y) вычисляет побитовое XOR между x и y.
2. Преобразование условия в маску: -(x < y) преобразует логическое выражение (x < y) в побитовую маску: все единицы, если условие истинно, и все нули, если условие ложно.
3. Комбинирование с y: ((x ^ y) & -(x < y)) сохраняет значение x, если x меньше y, и обнуляет его в противном случае.
4. Финальный XOR: y ^ (...) окончательно комбинирует результат с y.
Если x < y, то маска будет состоять из всех единиц, и результат будет равен x. В противном случае, результат останется равен y.
В большинстве современных процессоров использование условных операторов и тернарных операторов будет оптимальным, так как компиляторы могут эффективно обрабатывать такие конструкции. Однако понимание того, как можно избежать ветвлений с помощью побитовых операций, расширяет ваше знание оптимизаций и может быть полезно в специфических случаях.
BY Алгоритмы и структуры данных

Share with your friend now:
tgoop.com/the_algorithms/4789