$ echo $(( 255 ))
255
$ echo $(( 33 ))
33
$ echo $(( ~33 ))
-34
$ echo $(( ~255 ))
-256
$
und mein kernel ist:
$ uname -a
Linux HOSTNAME 3.2.0-40-generic-pae #64-Ubuntu SMP Mon Mar 25 21:44:41 UTC 2013 i686 i686 i386 GNU/Linux
FRAGE: Ist ~
für die Verneinung der Nummer AFAIK. Aber warum ~33
produziert -34
und warum ~255
produziert -256
?
bash
shell
arithmetic
Gasko Peter
quelle
quelle
Antworten:
Die Manpage von bash sagt:
Vorzeichenbehaftete Nummern werden normalerweise in der Zweierkomplementdarstellung gespeichert :
Das bedeutet, wenn Sie eine Zahl wie 2 nehmen, wird diese bitweise als 0010 interpretiert. Nach bitweiser Negation wird dies zu 1101, was der Darstellung von -3 entspricht.
quelle
Dies ist das Ergebnis der Zweierkomplementarithmetik.
~
ist eine bitweise Negation, die alle bearbeiteten Bits invertiert. Die Zweierkomplementarithmetik arbeitet, indem alle Bits invertiert und 1 addiert werden. Da Sie nur die Bits invertiert, aber nicht eins addiert haben, erhalten Sie die gleiche Zahl, invertiert, minus eins.Wikipedia hat einen guten Artikel auf Zweier-Komplement hier .
Als Beispiel:
0011
1101
0011
gibt Ihnen1100
, was -4 ist, da Sie nicht 1 hinzugefügt haben.quelle
Der Operator ~ ist der bitweise Operator NOT. Es zu benutzen ist nicht dasselbe wie eine Zahl zu negieren.
Aus Wikipedia ist eine bitweise NOT-Operation gleich dem Zweierkomplement des Wertes minus eins:
Das Negieren einer Binärzahl entspricht der Annahme ihres Zweikomplementwerts.
Mit dem Operator ~ NOT = wird der Ein-Komplement-Wert verwendet.
Einfacher ausgedrückt, ~ kippt einfach alle Bits der Binärdarstellung .
Für Ihre Beispiele:
Oder in Dezimalarithmetik mit der Formel ~ x = -x - 1:
und
quelle
Das Problem ist, dass ~ ein bitweiser Operator ist. Sie negieren also mehr Bits, als Sie vielleicht beabsichtigen. Sie können dies besser sehen, indem Sie die Ergebnisse in hexadezimal konvertieren. Beispiel:
im Vergleich zu dem, was du hattest:
Ich gehe davon aus, dass Sie 0x33 negieren wollen. Wenn dies der Fall ist, würde dies funktionieren:
Sie müssen auch & verwenden, das der bitweise Operator ist, um das gesamte ff am Anfang zu vermeiden.
quelle
Der
~
(arithmetische) Operator kippt alle Bits , er heißt bitweiser Negationsoperator: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.Eine Zahl mit allen Einsen wird als negative Zahl (erstes Bit
1
)1
oder einfach interpretiert-1
.Das Gleiche gilt für alle anderen Zahlen, zum Beispiel:
$(( ~1 ))
Alle Bits spiegeln:Oder binär:
1111111111111111111111111111111111111111111111111111111111111110
Was, als Zahl in Zweierdarstellung interpretiert, ist:
Im Allgemeinen ist die menschliche mathematische Gleichung
$(( ~n ))
gleich$(( -n-1 ))
Und (deine Frage):
quelle
Zuerst muss man verstehen, dass 33 eine 32-Bit- oder eine 64-Bit-Zahl ist.
Zur Vereinfachung nehme ich eine 8-Bit-Nummer (= 1 Byte)
Dezimal 33 besteht aus acht Bits: 00100001, das Umkehren der Bits ergibt 11011110.
Da das höherwertige Bit 1 ist, ist es eine negative Zahl.
Wenn Sie eine negative Zahl drucken, druckt das System ein Minuszeichen und ergänzt die negative Zahl um eine Zwei.
Das Komplement von Zwei ist: Kippen der Bits und Addieren von 1.
11011110 ==> 00100001 ==> Das Hinzufügen von 1 ==> 00100010 ergibt eine Dezimalstelle 34 hinter dem Minuszeichen.
quelle