Оператор ~
(арифметический) переворачивает все биты , он называется оператором побитового отрицания:
! ~ 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