mascheratura con &
È meglio:
&
è affidabile per firmato e unsigned some_var
, mentre bitshifting destra un numero negativo produce un'implementazione definito risultato:
Il valore di E1> > E2 è E1 a destra con posizioni di bit E2 spostate a destra. [...] Se E1 ha un tipo firmato e un valore negativo, il valore risultante è definito dall'implementazione.
- su ogni CPU che abbia mai conosciuto (Z80, 6502C, 86, 68000, UltraSparc), bit-E è una singola istruzione CPU e prende un ciclo di clock ... è estremamente improbabile che sia più lento o prendere più byte di codice macchina rispetto all'approccio basato sul cambio di bit che hai menzionato, anche se il compilatore potrebbe comunque ottimizzarlo a un bit AND.
Lo svantaggio di mascheramento è che è relativamente facile avere accidentalmente 7 o 9 F
s, mentre un errore nel 32
è ovvio: ci sono altri modi per generare il valore di mascheratura però, ad esempio (1LL<<32)-1
o l'hackish ma in qualche modo elegante uint32_t(-1)
.
Naturalmente, se lower
è uint32_t
e some_var
uint64_t
, si può semplicemente lasciare che la conversione sia implicita, per cui l'ottimizzatore non ha nemmeno bisogno di realizzare il bit-E può essere rimosso prima assegnazione, ma che potrebbe dare un avviso del compilatore, che è possibile silenziare ala ...
uint32_t lower = static_cast<uint32_t>(some_var);
il mascheramento è utile soprattutto durante l'assegnazione ad un altro uint64_t
, o quando la maschera non è per tutti i 32 bit meno significativi.
fonte
2015-03-20 05:55:48
Qual è il tipo esatto di 'some_var'? Specificamente, è non firmato? – Suma
@Suma Sì, uint64_t. –