Изменения

Перейти к: навигация, поиск

Побитовые операции

49 байт добавлено, 23:51, 20 марта 2016
Нахождение минимума и максимума из двух чисел без использования условного оператора
Этот способ корректен только если можно утверждать, что величина <tex>(x - y)</tex> лежит между граничными значениями типа int.
Пусть даны числа <tex>x</tex> и <tex>y</tex> разрядности <tex>n</tex>. Тогда, если <tex>x < y</tex>, то <tex>((x - y) \texttt{>>} (n - 1)) = -1</tex> а если <tex>x \geqslant y</tex>, то <tex>((x - y) \texttt{>>} (n - 1)) = 0</tex>. Выражение <tex>((x - y) \& ((x - y) \texttt{>>} (n - 1))</tex> принимает значение <tex>0</tex>, если <tex>x \geqslant y</tex> и <tex>(x - y)</tex>, если <tex>x < y</tex>.
<code>
<font color = green>// n {{---}} разрядность чисел</font>'''int32''' min(x, y: '''int32'''): min = '''return''' y + ((x - y) & ((x - y) >> (n - 1)31)) '''int32''' max = (x, y: '''int32'''): '''return''' x - ((x - y) & ((x - y) >> (n - 1)31))
</code>
276
правок

Навигация