2010-03-03 19 views
21

Ich habe eine wirklich große Nummer: 5799218898. Und möchte es richtig auf 13 Bits verschieben.
So, windows-Rechner oder Python gibt mir:Bitshift in Javascript

 
5799218898 >> 13 | 100010100100001110011111100001 >> 13 
70791   | 10001010010000111 

Wie erwartet.

Aber Javascript:

 
5799218898 >> 13 | 100010100100001110011111100001 >> 13 
183624   | 101100110101001000 

Ich denke, es ist wegen der internen Integer-Darstellung in Javascript, kann aber nichts darüber finden.

+3

Die richtige Antwort ist eigentlich 707912 (10101100110101001000), die es deutlicher macht, dass die ersten zwei Binärziffern abgeschnitten werden. – Miles

Antwort

25

In ECMAScript (Javascript) sind bitweise Operationen immer in 32-Bit. Deshalb wird 5799218898 in 32-Bit zerhackt, was 1504251602 wird. Diese ganze Zahl >> 13 ergibt 183624.

In Python sind sie Ganzzahlen mit beliebiger Länge. Also, es gibt kein Problem.

(Und die Zahlen in Windows-Rechner sind 64-bit, genug 5799218898. passen)

(Und die richtige Antwort sollte 707912. sein)

+0

Danke, das war's. Sieht aus wie ich dieses Verhalten in Python wie folgt emulieren kann (5799218898 & 0xFFFFFFFF) >> 13 – Andrew

2

Die Zahl, die Sie haben (5799218898) ist über 32 Bits. Sie haben die JavaScript-Engine, mit der Sie testen, nicht erwähnt, aber es ist sehr wahrscheinlich, dass es sich um 32-Bit handelt.

Um zu testen, trimmen Sie die "5" am Anfang Ihrer Nummer, so dass Sie innerhalb der 32-Bit-Grenze fallen. Dann sollte deine Schicht gut funktionieren.

+1

Ich benutze Firefox 3.6 auf 64bit system – Andrew

+7

Alle JavaScript-Engines verwenden 64-Bit-Gleitkommazahlen und konvertieren für bitweise 32-Bit-Ganzzahlen Operationen, unabhängig von der Architektur. Es ist im ECMAScript-Standard definiert. –

1

Wie Nicholas Zakas states:

Obwohl JavaScript Zahlen sind technisch in 64-Bit werden Werte Integer gespeichert behandelt, als ob sie 32 Bits sind, wenn Bitoperatoren beteiligt sind.