O ~
operador (aritmético) vira todos os bits , é chamado de operador de negação bit a bit:
! ~ logical and bitwise negation
Portanto, em locais onde o contexto é aritmético, ele altera um número com todos os bits como zeros para todos os bits como um. A $(( ~0 ))
converte todos os bits da representação numérica (normalmente hoje em dia, 64 bits) em todos.
$ printf '%x\n' "$(( ~0 ))"
ffffffffffffffff
Um número com todos os números é interpretado como o número negativo (primeiro bit 1
) 1
, ou simplesmente -1
.
$ printf '%x\n' "-1"
ffffffffffffffff
$ echo "$(( ~0 ))"
-1
O mesmo acontece com todos os outros números, por exemplo: $(( ~1 ))
vira todos os bits:
$ printf '%x\n' "$(( ~1 ))"
fffffffffffffffe
Ou, em binário: 1111111111111111111111111111111111111111111111111111111111111110
O qual, interpretado como um número na representação de dois, é:
$ echo "$(( ~1 ))"
-2
Em geral, a equação matemática humana $(( ~n ))
é 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
E (sua pergunta):
$ n=33 ; echo "$(( ~n )) $(( -n-1 ))"
-34 -34