Возможно, некоторые диаграммы помогут.Я буду использовать 8-битные числа для того, чтобы константы были короткими, они обобщаются в целые и длинные значения очевидным образом.
Абсолютное представление:
Unsigned number line:
[ 0 .. 0x7F ][ 0x80 .. 0xFF]
Signed number line:
[ 0x80 .. 0xFF ][ 0 .. 0x7F]
Относительное представление:
Unsigned number line:
[ 0 .. 0x7F ][ 0x80 .. 0xFF]
Signed number line:
[ 0x80 .. 0xFF ][ 0 .. 0x7F]
Таким образом, числа со знаком и без знака в основном имеют одинаковый относительный порядок, за исключением того, что два диапазона с установленным битом знака и не установленным битом знака меняются местами по порядку.Инвертирование этого бита, конечно, меняет порядок.
x ^ Long.MIN_VALUE
инвертирует знаковый бит для long
.
Этот трюк применим для любой операции, которая зависит только от относительного порядка, дляпример сравнения и непосредственно связанные операции, такие как мин и макс.Он не работает для операций, которые зависят от абсолютной величины чисел, таких как деление.