L' ~
opérateur (arithmétique) retourne tous les bits , il est appelé l'opérateur de négation au niveau du bit:
! ~ logical and bitwise negation
Ainsi, dans les endroits où le contexte est arithmétique, il change un nombre avec tous les bits sous forme de zéros en tous les bits sous forme de uns. A $(( ~0 ))
convertit tous les bits de la représentation numérique (généralement 64 bits de nos jours) en tous ceux.
$ printf '%x\n' "$(( ~0 ))"
ffffffffffffffff
Un nombre avec tous les uns est interprété comme le nombre négatif (premier bit 1
) 1
, ou simplement -1
.
$ printf '%x\n' "-1"
ffffffffffffffff
$ echo "$(( ~0 ))"
-1
La même chose se produit pour tous les autres nombres, par exemple: $(( ~1 ))
retourne tous les bits:
$ printf '%x\n' "$(( ~1 ))"
fffffffffffffffe
Ou, en binaire: 1111111111111111111111111111111111111111111111111111111111111110
Ce qui, interprété comme un nombre dans la représentation de deux, est:
$ echo "$(( ~1 ))"
-2
En général, l'équation mathématique humaine $(( ~n ))
est égale à$(( -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
Et (votre question):
$ n=33 ; echo "$(( ~n )) $(( -n-1 ))"
-34 -34