El ~
operador (aritmético) voltea todos los bits , se llama operador de negación bit a bit:
! ~ logical and bitwise negation
Entonces, en lugares donde el contexto es aritmético, cambia un número con todos los bits como ceros a todos los bits como unos. A $(( ~0 ))
convierte todos los bits de la representación numérica (generalmente 64 bits hoy en día) a todos.
$ printf '%x\n' "$(( ~0 ))"
ffffffffffffffff
Un número con todos se interpreta como el número negativo (primer bit 1
) 1
, o simplemente -1
.
$ printf '%x\n' "-1"
ffffffffffffffff
$ echo "$(( ~0 ))"
-1
Lo mismo ocurre con todos los demás números, por ejemplo: $(( ~1 ))
voltea todos los bits:
$ printf '%x\n' "$(( ~1 ))"
fffffffffffffffe
O, en binario: 1111111111111111111111111111111111111111111111111111111111111110
Lo cual, interpretado como un número en la representación de dos es:
$ echo "$(( ~1 ))"
-2
En general, la ecuación matemática humana $(( ~n ))
es igual 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
Y (tu pregunta):
$ n=33 ; echo "$(( ~n )) $(( -n-1 ))"
-34 -34