2010-08-06 20 views
16

En ce moment, j'utilise ceci pour définir/bits individuels dans un octet unset:manière simple à définir/supprimer un bit individuel

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

Mais, ne pouvez-vous faire cela dans un plus simple,/élégante façon? Comme la mise en ou hors service du bit en une seule opération?

Note: Je comprends que je peux écrire une fonction pour cela, je me demande simplement si je ne vais pas réinventer la roue.

+4

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

+4

@obelix: Voilà donc comment ça a été avant tout les questions trviales ont déjà été répondues? + 112/+ 241, 90 Favs? Grande question/Grande Réponse Badge Or? –

Répondre

12

Bien sûr! Il serait plus évident si vous décompressé le |= et &= dans votre code, mais vous pouvez écrire:

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

Notez que bit4Set doit être nul ou un -Pas tout à valeur non nulle pour que cela fonctionne. Mettez-le dans une fonction, le type bool appliquera 0,1 pour toutes les entrées de bitval.

+0

non défini, puis défini en fonction de bit4set. Je n'y ai pas pensé. Tks. – djeidot

+7

'nbyte = (nbyte & ~ (1 << 4)) | ((!! bit4Set) << 4) 'prend en charge bit4Set n'étant pas zéro ou un. –

11

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

si je le mets dans une fonction je préfère utiliser le code que j'ai écrit. C'est juste, néanmoins. – djeidot

+5

Si vous laissez le compilateur intégrer cette fonction en C++, alors ce sera aussi rapide que si vous aviez utilisé l'expression elle-même, plus vous obtenez le bonus de lisibilité. –

0
nbyte |= (1 << 4); 

Si le côté droit de l'affectation, (1 << 4), est toujours une constante comme ça, alors ce serait probablement optimisé par le compilateur de sorte qu'il sera plus simple dans l'assemblage résultant:

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

Voici la réponse à la question "Comment définir le bit 4 dans nbyte?". La question est "Comment est-ce que je mets ou non le bit 4 en nbyte selon la valeur de bit4Set?" –

+0

Merci. J'ai mal compris la question. Devrais-je supprimer ma réponse? – Donotalo

6

Ceci est un idiome parfaitement sensible et complètement standard.

+1

+1 Je vois cet idiome encore et encore dans le code du microcontrôleur. –

+0

Il _probably_ introduit une branche qui peut affecter les performances.La réponse de Pascal Cuoq peut être moins lisible, mais plus performante. –

4

Avez-vous envisagé d'affecter des mnémoniques et/ou des identifiants à vos bits, plutôt que de vous y référer par numéro? Par exemple, supposons que le bit de réglage 4 initie une SCRAM de réacteur nucléaire. Au lieu de le désigner comme "bit 4" nous l'appellerons INITIATE_SCRAM. Voici comment le code pour cela pourrait ressembler:

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

... 

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

Ce ne sera pas nécessairement plus efficace (après optimisation) que votre code d'origine, mais il est un peu plus clair, je pense, et probablement plus maintenable.

+0

c'est à peu près la même chose. J'utilise des identifiants, je ne les ai pas mis dans l'exemple. – djeidot

2

Ceci est marqué comme C++ donc avez-vous envisagé d'utiliser std::bitset au lieu de faire vous-même la manipulation des bits? Ensuite, vous pouvez simplement utiliser la notation de tableau comme: bits[3] = bit4Set pour définir le bit approprié.

Questions connexes