Der ~
(arithmetische) Operator kippt alle Bits , er heißt bitweiser Negationsoperator:
! ~ logical and bitwise negation
An Stellen, an denen der Kontext arithmetisch ist, wird eine Zahl mit allen Bits als Nullen in alle Bits als Einsen geändert. A $(( ~0 ))
konvertiert alle Bits der Zahlendarstellung (heutzutage normalerweise 64 Bits) in alle.
$ printf '%x\n' "$(( ~0 ))"
ffffffffffffffff
Eine Zahl mit allen Einsen wird als negative Zahl (erstes Bit 1
) 1
oder einfach interpretiert -1
.
$ printf '%x\n' "-1"
ffffffffffffffff
$ echo "$(( ~0 ))"
-1
Das Gleiche gilt für alle anderen Zahlen, zum Beispiel: $(( ~1 ))
Alle Bits spiegeln:
$ printf '%x\n' "$(( ~1 ))"
fffffffffffffffe
Oder binär: 1111111111111111111111111111111111111111111111111111111111111110
Was, als Zahl in Zweierdarstellung interpretiert, ist:
$ echo "$(( ~1 ))"
-2
Im Allgemeinen ist die menschliche mathematische Gleichung $(( ~n ))
gleich$(( -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
Und (deine Frage):
$ n=33 ; echo "$(( ~n )) $(( -n-1 ))"
-34 -34