L'ho visto un paio di volte, ma mi sembra che l'uso dello spostamento bit a bit abbia impedito la leggibilità. Perché viene usato? È più veloce della semplice moltiplicazione per 2?C'è qualche vantaggio nell'usare '<< 1' invece di '* 2'?
risposta
È 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.
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).
Se si utilizza un vecchio compilatore C, è preferibile utilizzare bit per bit. Per la leggibilità puoi comunque commentare il tuo codice.
È 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.
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
+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). –
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.
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.
- 1. Perché usare 1 << 4 invece di 16?
- 2. In Java, quando si usano i bitshifts, perché 1 << 32! = 1 << 31 << 1?
- 3. char_x <(char_y + 1) == char_x <= char_y?
- 4. Che cos'è 1 << 0?
- 5. Valutazione dell'espressione 1 <= mese <= 12
- 6. Cosa fa il reindirizzamento "2 <& 1" nella shell Bourne?
- 7. JSF 2.0: C'è qualche vantaggio nell'uso di DataModel <T> su Elenco <T> per le applicazioni CRUD
- 8. Uso \ invece di + o << per concatenare quelle stringhe
- 9. ValueError: num deve essere 1 <= num <= 2, non 3
- 10. Perché std :: cout << principale << std :: endl stampa 1?
- 11. Perché <invece di << nell'output dello stream è ancora compilato?
- 12. Differenza tra `nomi (df [1]) <-` e `nomi (df) [1] <-`
- 13. Cython: per i da 1 <= i <N
- 14. Does "cout << (char *) NULL" facendo "close (1)" qui?
- 15. GIT i file corrotti (<<<<<<<< testa)
- 16. Differenza tra @ (posked Clk); a <= 1'b1; e @ (posedge Clk) a <= 1'b1;
- 17. Come inizializzare un oggetto di std :: array <std :: array <T, 2>, 2>?
- 18. Perché "one" <2 ... FALSE in R?
- 19. Php cosa significa <<<?
- 20. Fai un <br> invece di <div></div> premendo Invio su un contenteditable
- 21. Perché foreach aumenta il conteggio di 2 invece di 1?
- 22. differenza tra <> e =
- 23. Perché di Guava TypeToken <T> .getRawType() ritorno Classe <? super T> invece di Classe <T>
- 24. Hibernate Criteri: ORA() <data + 1 giorno
- 25. Errore PHP riga 1: `<?php ?> '
- 26. Qual è l'uso di dire <? si estende SomeObject> invece di <SomeObject>
- 27. HtmlAgilityPack - Lo <form> si chiude per qualche motivo?
- 28. PHP espressione <<< EOB
- 29. MySQL - TRA l'operatore con FLOAT (10,6) funziona come> e <, invece di> = e <=
- 30. non firmato lungo 0 <-1?
Questo è facile da testare. Provalo e basta –
come? Usando il "tempo"? –