Operator ~
(arytmetyczny) odwraca wszystkie bity , nazywany jest bitowym operatorem negacji:
! ~ logical and bitwise negation
Tak więc w miejscach, w których kontekst jest arytmetyczny, zmienia liczbę ze wszystkimi bitami jako zerami na wszystkie bity jako jedności. A $(( ~0 ))
konwertuje wszystkie bity reprezentacji liczb (zwykle obecnie 64 bity) na wszystkie.
$ printf '%x\n' "$(( ~0 ))"
ffffffffffffffff
Liczba z wszystkimi z nich jest interpretowana jako liczba ujemna (pierwszy bit 1
) 1
lub po prostu -1
.
$ printf '%x\n' "-1"
ffffffffffffffff
$ echo "$(( ~0 ))"
-1
To samo dzieje się ze wszystkimi innymi liczbami, na przykład: $(( ~1 ))
odwraca wszystkie bity:
$ printf '%x\n' "$(( ~1 ))"
fffffffffffffffe
Lub binarnie: 1111111111111111111111111111111111111111111111111111111111111110
Który interpretowany jako liczba w reprezentacji dwóch jest następujący:
$ echo "$(( ~1 ))"
-2
Ogólnie rzecz biorąc, równanie matematyczne człowieka $(( ~n ))
jest równe$(( -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
I (twoje pytanie):
$ n=33 ; echo "$(( ~n )) $(( -n-1 ))"
-34 -34