Сначала давайте посмотрим на эту часть:
-(x < y)
Если условие истинно, т. Е. Если x
меньше y
, то выражение в скобках равно 1, а все выражение равно -1,Если условие ложно, то выражение имеет значение 0.
Теперь давайте рассмотрим его в контексте подвыражения следующего уровня:
((x ^ y) & -(x < y))
Исходя из вышеизложенного условия, это будетуменьшите до одного из следующего:
((x ^ y) & 0) // x is larger or equal
((x ^ y) & -1) // y is larger
Выполнение побитового И с 0 приводит к тому, что все биты результата равны 0, поэтому первое выражение будет 0. Значение -1, предполагая представление дополнения до двух,все биты установлены в 1. Таким образом, выполнение побитового И с -1 приведет к значению другого операнда.
Итак, теперь рассмотрим полное выражение для max
:
x ^ ((x ^ y) & -(x < y))
Это означает:
x ^ (0) // x is larger or equal
x ^ (x ^ y) // y is larger
В первом случае выполнение XOR с 0 приводит к значению другого операнда, поэтому окончательный результат равен x
.Во втором случае ^
является ассоциативным, так что вы можете смотреть на него как (x ^ x) ^ y
. Если XOR для числа с самим собой, то получится 0, а XOR для 0 с y
даст вам y
.
. *Функция 1030 * работает аналогично с y
вместо x
для первого операнда:
y ^ (0) // x is larger or equal
y ^ (x ^ y) // y is larger
Это даст противоположный результат max
.