2010-03-03 5 views
21

Ho un numero veramente grande: 5799218898. E voglio spostarlo a destra a 13 bit.
Così, le finestre-calcolatrice o pitone mi da:Bitshift in javascript

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

come previsto.

Ma Javascript:

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

penso che sia a causa della rappresentazione intera interna in javascript, ma non riesce a trovare nulla.

+3

La risposta corretta è in realtà 707912 (10101100110101001000) che rende più chiaro che le prime due cifre binarie vengono troncate. – Miles

risposta

25

In ECMAScript (Javascript) le operazioni bit a bit sono sempre a 32 bit. Quindi 5799218898 viene tagliato a 32-bit che diventa 1504251602. Questo numero intero >> 13 fornisce 183624.

In Python sono numeri interi di lunghezza arbitraria. Quindi non c'è nessun problema.

(E i numeri nella calcolatrice di Windows sono a 64-bit, abbastanza da contenere 5799218898.)

(E la risposta corretta dovrebbe essere 707912.)

+0

Grazie, è tutto. Sembra che io possa emulare questo comportamento in Python come questo (5799218898 & 0xFFFFFFFF) >> 13 – Andrew

2

Il numero che avete (5.799.218,898 mila) è oltre 32 bit. Non hai menzionato il motore JavaScript che stai testando, ma è molto probabile che sia a 32 bit.

Per testare, ritagliare il "5" all'inizio del numero in modo da cadere all'interno del limite a 32 bit. Quindi il tuo turno dovrebbe funzionare bene.

+1

Sto usando Firefox 3.6 su sistema 64 bit – Andrew

+7

Tutti i motori JavaScript usano numeri a virgola mobile a 64 bit e convertono in numeri interi a 32 bit per bit operazioni, indipendentemente dall'architettura. È definito nello standard ECMAScript. –

1

Come Nicholas Zakas states:

Anche se i numeri JavaScript sono tecnicamente memorizzati in 64 bit, interi valori sono trattati come se fossero 32 bit quando operatori bit per bit sono coinvolti.