2010-08-06 14 views
16

Proprio ora sto usando questo per attivare/disattivare i bit individuali in un byte:modo semplice per impostare/disinserire un singolo bit

if (bit4Set) 
    nbyte |= (1 << 4); 
else 
    nbyte &= ~(1 << 4); 

Ma, non puoi farlo in modo più semplice/elegante modo? Ti piace impostare o disabilitare il bit in una singola operazione?

Nota: Capisco che posso solo scrivere una funzione per farlo, mi chiedo solo se non voglio reinventare la ruota.

+4

http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c – obelix

+4

@obelix: Quindi questo è il modo in cui SO era prima di tutto le domande pervenzionali erano già state risolte? + 112/+ 241, 90 preferiti? Grande domanda/Grande risposta Gold Badge? –

risposta

12

Sicuro! Sarebbe più evidente se si ampliato la |= e &= nel codice, ma si può scrivere:

nbyte = (nbyte & ~(1<<4)) | (bit4Set<<4); 

noti che bit4Set deve essere zero o uno -non qualsiasi a valore diverso da zero per far funzionare tutto questo.

+0

unset, quindi impostato in base a bit4set. Non ci ho pensato. Tks. – djeidot

+7

'nbyte = (nbyte & ~ (1 << 4)) | ((!! !! bit4Set) << 4) 'si prende cura di bit4Set non essendo zero o uno. –

11

Inseritelo in una funzione, il tipo di bool applicherà 0,1 per tutti gli input bitval.

int change_bit(int val, int num, bool bitval) 
{ 
    return (val & ~(1<<num)) | (bitval << num); 
} 
+0

se lo metto in una funzione preferisco usare il codice che ho scritto. È giusto, tuttavia. – djeidot

+5

Se si consente al compilatore di integrare questa funzione in C++, sarà veloce come se si fosse utilizzata l'espressione stessa, oltre a ottenere il bonus di leggibilità. –

0
nbyte |= (1 << 4); 

Se il lato destro della assegnazione, (1 << 4), è sempre una costante come questo, allora questo probabilmente essere ottimizzato compilatore modo sarà più semplice in assieme risultante:

mov r0, _nbyte 
mov r1, 10H   ; here is the optimization, no bit shift occured 
or r0, r1 
st _nbyte, r0 
+3

Questa è la risposta alla domanda "Come si imposta il bit 4 in nbyte?". La domanda è "Come faccio a impostare o disattivare il bit 4 in nbyte a seconda del valore di bit4Set?" –

+0

Grazie. Ho frainteso la domanda. Dovrei cancellare la mia risposta? – Donotalo

6

Questo è un idioma perfettamente sensato e completamente standard.

+1

+1 Vedo questo idioma più e più volte nel codice del microcontrollore. –

+0

It _probably_ introduce ramificazioni che possono influire sulle prestazioni.La risposta di Pascal Cuoq potrebbe essere meno leggibile, ma è più performante. –

4

Hai considerato l'assegnazione di mnemonici e/o identificatori ai tuoi bit, piuttosto che far riferimento a essi per numero?

Ad esempio, diciamo che l'impostazione del bit 4 avvia un reattore nucleare SCRAM. Invece di chiamarlo "bit 4" lo chiameremo INITIATE_SCRAM. Ecco come il codice per questo potrebbe essere:

int const INITIATE_SCRAM = 0x10; // 1 << 4 

... 

if (initiateScram) { 
    nbyte |= INITIATE_SCRAM; 
} else { 
    nbyte &= ~INITIATE_SCRAM; 
} 

Questo non sarà necessariamente più efficiente (dopo l'ottimizzazione) che il vostro codice originale, ma è un po 'più chiaro, credo, e probabilmente più gestibile.

+0

è praticamente la stessa cosa. In realtà sto usando gli identificatori, ma non li ho messi nell'esempio. – djeidot

2

Questo viene identificato come C++, quindi hai considerato l'utilizzo di std::bitset invece di eseguire personalmente tutte le operazioni di modifica dei bit? Quindi puoi semplicemente usare la notazione array come: bits[3] = bit4Set per impostare il bit appropriato.

Problemi correlati