Hier ist der Code-Schnipsel:Javascript verschieben rechts eine negative Zahl
var i = 101;
console.log('101: ' + i.toString(2));
console.log('101 >> 1: ' + (i >> 1).toString(2));
var l = -101;
console.log('-101: ' + l.toString(2));
console.log('-101 >> 1: ' + (l >> 1).toString(2));'
Ausgang:
"101: 1100101"
"101 >> 1: 110010"
"-101: -1100101"
"-101 >> 1: -110011"
Warum -101 >> 1
ist -110011
statt -110010
?
Update: das Buch Professional JavaScript für Web-Entwickler erklärt, wie js speichert eine negative Zahl:
- die binäre Darstellung des absoluten Werts der negativen Zahl erhalten
- 0s ersetzen 1s und 1s mit 0s
- add 1 zu dem Ergebnis von Schritt 2
Also in meinem Fall -101 >> 1
wir:
Die binäre Darstellung von Math.abs (-101) ist:
invertieren die 0 und 1:
1 hinzufügen, bis zum Ende:
Nun verschieben Sie sich nach rechts von 1:
Die obige Binärdatei sollte das korrekte Ergebnis von -101 >> 1
sein, aber beim Protokollieren der Binärdarstellung einer negativen Zahl setzt Javascript einfach ein negatives Vorzeichen vor die binäre Darstellung der positiven Zahl:
var x = 15;
console.log(x.toString(2)); // output: 1111
var y = -15;
console.log(y.toString(2)); // output: -1111
Für unser Beispiel bedeutet dies, dass, wenn das Ergebnis der -101 >> 1
, JS Anmeldung ausgibt minus sign
+ the binary representation of the positive number
.Aber die positive Zahl ist nicht 101 >> 1
weil 101 >> 1
gibt Ihnen:
(101 >> 1).toString(2); // output: 110010
(-101 >> 1).toString(2); // output: -110011, not -110010!
das richtige Ergebnis zu erhalten, haben wir den oben genannten Schritt umkehren 1-3:
1111 1111 1111 1111 1111 1111 1100 1101 // this is the result we get from step 4
Umkehr Schritt 3 von 1 subtrahiert, erhalten wir:
1111 1111 1111 1111 1111 1111 1100 1100
Umkehr Schritt 2 durch invertieren 0 und 1:
0000 0000 0000 0000 0000 0000 0011 0011
Umkehrschritt 1 durch diese binäre Umwandlung Integer:
parseInt(110011, 2); // output: 51
Wenn schließlich JS das Ergebnis -101 >> 1
anmeldet, wird es minus sign
+ the binary representation of 51
wird, das:
(51).toString(2); // output: 110011
(-101 >> 1).toString(2); // output: -110011
'>>' (Rechtsverschobenes Vorzeichen) - ** Dieser Operator verschiebt den ersten Operanden um die angegebene Anzahl von Bits nach rechts. Überschüssige Bits, die nach rechts verschoben sind, werden verworfen. Kopien des linken Bits werden von links nach innen geschoben. Da das neue Bit ganz links den gleichen Wert wie das vorhergehende Bit ganz links hat, ändert sich das Vorzeichenbit (das Bit ganz links) nicht. Daher der Name "sign-propagating". ** – evolutionxbox