Оператор ~
(арифметичний) перевертає всі біти , його називають оператором побітового заперечення:
! ~ logical and bitwise negation
Так, у місцях, де контекст є арифметичним, він змінює число з усіма бітами як нулі на всі біти як одиниці. A $(( ~0 ))
перетворює всі біти представлення числа (зазвичай це 64 біти сьогодні) у всі.
$ printf '%x\n' "$(( ~0 ))"
ffffffffffffffff
Число з усіма інтерпретується як негативне число (перший біт 1
) 1
, або просто -1
.
$ printf '%x\n' "-1"
ffffffffffffffff
$ echo "$(( ~0 ))"
-1
Те ж саме відбувається з усіма іншими номерами, наприклад: $(( ~1 ))
гортає всі біти:
$ printf '%x\n' "$(( ~1 ))"
fffffffffffffffe
Або у двійковій формі: 1111111111111111111111111111111111111111111111111111111111111110
Що, інтерпретується як число у поданні двох:
$ echo "$(( ~1 ))"
-2
Загалом, математичне рівняння людини таке, що $(( ~n ))
дорівнює$(( -n-1 ))
$ n=0 ; echo "$(( ~n )) $(( -n-1 ))"
-1 -1
$ n=1 ; echo "$(( ~n )) $(( -n-1 ))"
-2 -2
$ n=255 ; echo "$(( ~n )) $(( -n-1 ))"
-256 -256
І (ваше запитання):
$ n=33 ; echo "$(( ~n )) $(( -n-1 ))"
-34 -34