L' ~
operatore (aritmetico) lancia tutti i bit , si chiama operatore di negazione bit a bit:
! ~ logical and bitwise negation
Quindi, nei luoghi in cui il contesto è aritmetico, cambia un numero con tutti i bit come zero in tutti i bit come uno. A $(( ~0 ))
converte tutti i bit della rappresentazione numerica (di solito 64 bit al giorno d'oggi) in tutti i bit.
$ printf '%x\n' "$(( ~0 ))"
ffffffffffffffff
Un numero con tutti è interpretato come il numero negativo (primo bit 1
) 1
, o semplicemente -1
.
$ printf '%x\n' "-1"
ffffffffffffffff
$ echo "$(( ~0 ))"
-1
Lo stesso accade a tutti gli altri numeri, ad esempio: $(( ~1 ))
lancia tutti i bit:
$ printf '%x\n' "$(( ~1 ))"
fffffffffffffffe
Oppure, in binario: 1111111111111111111111111111111111111111111111111111111111111110
Che, interpretato come un numero nella rappresentazione di due è:
$ echo "$(( ~1 ))"
-2
In generale, l'equazione matematica umana $(( ~n ))
è uguale a$(( -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
E (la tua domanda):
$ n=33 ; echo "$(( ~n )) $(( -n-1 ))"
-34 -34