2010-02-25 7 views
7

Ehi, sono autoapprendimento a proposito di bit, e ho visto da qualche parte in Internet che lo spostamento aritmetico (>>) di un mezzo è un numero. Ho voluto provarlo:Perché le medie aritmetiche spostano un numero solo in ALCUNI INCIDENTI?

44 >> 1 returns 22, ok 
22 >> 1 returns 11, ok 
11 >> 1 returns 5, and not 5.5, why? 

Un altro esempio:

255 >> 1 returns 127 
127 >> 1 returns 63 and not 63.5, why? 

Grazie.

+1

bit Splitting non sono ammessi. Scusate. – leppie

+0

@leppie: eh ??? –

risposta

13

L'operatore di spostamento del bit in realtà non divide per 2. Invece, sposta i bit del numero a destra del numero di posizioni indicato sul lato destro. Ad esempio:

00101100 = 44 
00010110 = 44 >> 1 = 22 

noti come i bit nella seconda riga sono uguali a riga sopra, semplicemente spostato di una posizione verso destra. Ora guarda il secondo esempio:

00001011 = 11 
00000101 = 11 >> 1 = 5 

Questo è esattamente la stessa operazione di prima. Tuttavia, il risultato di 5 è dovuto al fatto che l'ultimo bit è spostato a destra e scompare, creando il risultato 5. A causa di questo comportamento, l'operatore di spostamento a destra sarà generalmente equivalente a dividere per due e quindi a buttare via ogni resto o parte decimale.

+0

Nella prima frase, penso che intendevi dire a destra. – Joel

+0

@Joel: hai ragione. Fisso. –

+0

Bene, l'operazione è esattamente uguale alla divisione intera o alla moltiplicazione per 2^n. – Tronic

1

Il binario non ha alcun concetto di numeri decimali. Restituisce il valore troncato (int).

11 = 1011 in binario. Sposta a destra e hai 101, che è 5 in decimale.

+0

È perfettamente possibile avere cifre dopo il punto "decimale" in binario. 101.1 ha perfettamente senso, la cifra dopo il punto rappresenta semplicemente 2^-1 nello stesso modo in cui rappresenta in decimale 10^-1. Il problema è che il tipo di dati non memorizza i dati in questo modo, quindi in un'operazione di spostamento di bit il valore viene troncato. – JonC

2

11 in binario è 1011

11 >> 1 

significa che spostare la vostra rappresentazione binaria a destra di un passo.

1011 >> 1 = 101 

Poi si hanno 101 in binario, che è 1 * 1 + 0 * 2 + 1 * 4 = 5.
Se tu avessi fatto 11 >> 2 si avrebbe come risultato 10 in IE binario 2 (1 * 2 + 0 * 1).

Spostamento di 1 a destra trasforma la somma (A_i * 2^i) [i = 0..n] in somma (A_ (i + 1) * 2^i) [i = 0..n-1 ] ecco perché se il tuo numero è pari (cioè A_0 = 0) è diviso per due. (mi dispiace per la sintassi personalizzata LateX ... :))

0

Lo spostamento del bit equivale a divisione o moltiplicazione per 2^n. Nell'aritmetica dei numeri interi il risultato viene arrotondato a zero in un numero intero. In aritmetica in virgola mobile non è permesso lo spostamento di bit.

Internamente il bit shifting, beh, sposta i bit, e l'arrotondamento significa semplicemente bit che cadono da un bordo semplicemente rimossi (non che in realtà calcoli il valore preciso e quindi lo arrotonda). I nuovi bit che appaiono sul lato opposto sono sempre zero per il lato destro e per valori positivi. Per i valori negativi, un bit viene aggiunto sul lato sinistro, in modo che il valore rimanga negativo (vedere come funziona two's complement) e la definizione aritmetica che ho usato rimane valida.

0

Nella maggior parte delle lingue tipizzate staticamente, il tipo restituito dell'operazione è ad es. "Int". Questo preclude un risultato frazionario, molto simile alla divisione di interi.

(Non ci sono risposte migliori su ciò che è 'sotto il cofano', ma non hanno bisogno di comprendere quelli di Grok le basi del sistema di tipo.)

Problemi correlati