Warum wird eine Verschiebung von 0 abschneiden der Dezimalstellen?
Vor kurzem fand ich dieses Stück JavaScript-code:
Math.random() * 0x1000000 << 0
Habe ich verstanden, daß der erste Teil war nur die Generierung einer Zufallszahl zwischen 0 und 0x1000000 (== 16777216).
Aber der zweite Teil schien seltsam. Was ist der Punkt der Durchführung einer bit-shift von 0? Ich glaube nicht, dass er alles tun würde. Bei der weiteren Untersuchung, ich habe jedoch festgestellt, dass die Verschiebung von 0 schien abschneiden der Nachkommastellen der Zahl. Darüber hinaus spielte es keine Rolle, ob es ein rechts oder ein Links-shift, oder sogar eine vorzeichenlose rechts-shift.
> 10.12345 << 0
10
> 10.12345 >> 0
10
> 10.12345 >>> 0
10
Getestet habe ich sowohl mit Firefox und Chrome, und das Verhalten ist das gleiche. Also, was ist der Grund für diese Beobachtung? Und ist es nur eine nuance von JavaScript, oder tritt es auch in anderen Sprachen? Ich dachte, ich Verstand bit-Verschiebung, aber das hat mich verwirrt.
In anderen Sprachen, ist es meistens nicht funktioniert. Python, C#, VB.NET, Java, Ruby alle verbieten es, unter... so ziemlich alles andere.
Es hat die gleiche Wirkung Perl, obwohl.
InformationsquelleAutor voithos | 2012-08-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist korrekt; es wird verwendet zum abschneiden der Wert.
Den Grund
>>
funktioniert, weil es funktioniert nur auf 32-bit-Ganzzahlen, so wird der Wert abgeschnitten. (Es ist auch allgemein verwendet in Fällen wie diesen anstelle vonMath.floor
weil bitweise Operatoren haben eine niedrige Rangfolge, so können Sie vermeiden, ein Durcheinander von Runden Klammern.)Und da es funktioniert nur auf 32-bit-Ganzzahlen ist, ist es auch gleichwertig zu einer Maske mit
0xffffffff
nach der Rundung. Also:Aber das ist nicht Teil der beabsichtigten Verhalten, da
Math.random()
zurückkehren wird, einen Wert zwischen 0 und 1.Auch, es macht das gleiche wie
| 0
, was häufiger ist.>>
funktioniert? Tut es zwingen, die Art in eine ganze Zahl?Ja. Ein 32-bit-Ganzzahl.
Lesen Sie den Absatz wieder. Bitweise Verschiebungen funktionieren auf 32-bit-Ganzzahlen, so hat es zu sein genötigt in einer für den Wandel getan werden.
Es nicht rund, es schneidet. Was sind
-1.6 << 0
undMath.round(-1.6)
?bewegt sich in Richtung negativ unendlich,
ceil
Richtung positiv unendlich,round
Runden, "casting" (oder das JavaScript-äquivalent davon) schneidet.InformationsquelleAutor Ry-
Math.random()
gibt eine Zahl zwischen 0 (inklusive) und 1 (exklusive). Die Multiplikation dieser Zahl mit einer ganzen Zahl ergibt eine Zahl, dezimal Anteil. Die<<
- operator ist eine Abkürzung für die Beseitigung der Dezimalteil:Die obigen Aussagen bedeutet, dass die JavaScript-engine wird implizit konvertiert beide Operanden von
<<
Betreiber zu 32-bit-Ganzzahlen; für zahlen es tut so, indem Sie hacken aus dem gebrochenen Teil (zahlen, die nicht passen 32-bit-integer-Bereich Locker mehr als nur der Dezimalteil).Werden Sie feststellen ähnliches Verhalten in schwach typisierten Sprachen. PHP-Beispiel:
Für stark Arten Sprachen, die Programme in der Regel verweigern zu kompilieren. C#, beschwert sich so:
Für diese Sprachen, Sie bereits Typ-casting-Operatoren:
InformationsquelleAutor Salman A
Aus der Mozilla-Dokumentation von bitweisen Operatoren (die shift-Operatoren)
Also im Grunde der code, der etwas beiläufigen Aspekt der shift-operator als einzige wichtige Sache, die es tut aufgrund der Verschiebung von 0 bits. Ick.
Ich kann nicht sprechen für alle Sprachen natürlich, aber weder Java noch C# erlauben
double
Werte werden der linke operand ein shift-operator.TypeError
wenn Sie versuchen, schieben Sie einen float durch int.InformationsquelleAutor Jon Skeet
Laut ECMAScript Language Specification:
http://ecma-international.org/ecma-262/5.1/#sec-11.7.1
InformationsquelleAutor Peter
Dem Verhalten, das Sie beobachten, ist definiert in der ECMA-262-standard
Hier ein Auszug aus der Spezifikation der
<<
Links-shift-operator:Wie Sie sehen können, werden beide Operanden sind gegossen, um 32-bit-Ganzzahlen. Damit das verschwinden von dezimalen teilen.
Gilt das gleiche für die andere bit-shift-Operatoren. Sie finden Ihre entsprechenden Beschreibungen in Abschnitt 11.7 Bitweise Shift-Operatoren der das Dokument, das ich verlinkt.
In diesem Fall, die einzige Auswirkung, die der Durchführung der Verschiebung der Konvertierung geben.
Math.random()
gibt ein Fließkomma-Wert.InformationsquelleAutor toniedzwiedz