2009-09-21 24 views

risposta

17

È più veloce nei vecchi compilatori che non ottimizzano le chiamate * 2 emettendo un'istruzione di spostamento a sinistra. Questa ottimizzazione è davvero facile da rilevare e qualsiasi compilatore decente lo fa già.

Se influisce sulla leggibilità, non utilizzarlo. Scrivi sempre il tuo codice nel modo più chiaro e conciso, poi se hai problemi di velocità torna indietro e profila le ottimizzazioni della mano.

2

Per alcune architetture, lo spostamento dei bit è più veloce della moltiplicazione. Tuttavia, qualsiasi compilatore degno di questo sale ottimizzerà * 2 (o qualsiasi moltiplicazione per una potenza di 2) per uno spostamento di bit a sinistra (quando uno spostamento di bit sarebbe più veloce).

1

Se si utilizza un vecchio compilatore C, è preferibile utilizzare bit per bit. Per la leggibilità puoi comunque commentare il tuo codice.

22

È necessario utilizzare * quando si sta moltiplicando e < < quando si esegue lo spostamento di bit. Sono matematicamente equivalenti, ma hanno significati semantici diversi. Ad esempio, se stai costruendo un campo flag, usa il bit shifting. Se stai calcolando un totale, usa la moltiplicazione.

+0

ottimo punto. Se vuoi spostare i bit in un posto a sinistra, usa '<< 1'. se vuoi fare un numero due volte più grande, usa '* 2'. Stesso effetto, ma molto più chiaro per cosa stai usando il numero. – nickf

+2

+1. Esprimi il tuo ** intent ** nel tuo codice, non provare a indovinare il compilatore (a meno che tu non abbia profilato il codice e determinato che farlo in un modo o nell'altro faccia una differenza significativa nelle prestazioni). –

6

Viene utilizzato quando si tratta dei singoli bit dei dati con cui si sta lavorando. Ad esempio, se si desidera impostare il byte superiore di una parola per 0x9A, si potrebbe non scrivere

n |= 0x9A * 256 

devi scrivere:

n |= 0x9A << 8 

In questo modo è più chiaro che si sta lavorando con bit, piuttosto che i dati che rappresentano.

2

Per facilitare la lettura dei valori utilizzati come campi di bit:

enum Flags { UP  = (1<<0), 
      DOWN  = (1<<1), 
      STRANGE = (1<<2), 
      CHARM = (1<<3), 
      ... 

che credo sia preferibile a uno '= 1, ..., = 2, ... = 4' o '= 1, .. . = 2, = 2 * 2, ... = 2 * 3 'soprattutto se si hanno 8+ flag.

Problemi correlati