2013-10-27 16 views
13

Sto cercando di utilizzare maschere e manipolare bit specifici in un byte. Ad esempio:Come capovolgere un bit specifico in un byte in C?

Voglio scrivere un programma in C che capovolge due bit in posizioni particolari, ad es. il bit in posizione 0 e quello in terza posizione. Quindi, 11100011, diventerebbe 01110011.

Come posso scambiare questi bit?

+1

Otterrete una risposta specifica a questo ma algebra booleana di Google e tabelle di verità. –

risposta

15

lanciando un po 'è fatto da XOR-zione con una maschera: bit impostati nelle posizioni che si desidera capovolgere, e quindi eseguire un XOR, come questo:

int mask = 0x90; // 10010000 
int num = 0xE3; // 11100011 
num ^= mask;  // 01110011 

Ecco alcune note:

  1. bit sono comunemente contati dalla posizione meno significativa, in modo che l'esempio flips bit nelle posizioni 4 e 7, non a posizioni 0 e 4
  2. per costruire una maschera di bit per una singola posizione, usa espressione 1 << n, dove n è il numero di posizione che conta dal bit meno significativo.
  3. Per combinare più bit in una singola maschera, utilizzare l'operatore |. Ad esempio, (1 << 4) | (1 << 7) costruisce la maschera per lanciare i bit 4 e 7.
0

Innanzitutto, buona fortuna!

Un'osservazione - è più utile per contare i bit da destra e sinistra non, poiché ci sono vari formati byte/word (8-bit, 16-bit, ecc.) E che conta conserva migliore compatibilità. Quindi nel tuo caso ti riferisci ai bit # 7 e # 4 (zero-count).

Intendevi "flip" (cambia 0 < -> 1 bit) o ​​"cambia" tra uno e l'altro?

Per la prima opzione, la risposta sopra (XOR con "int mask = 0x90; // 10010000") è molto buona. Per il secondo, è un po 'più complicato (ma non molto).

+0

Grazie! Intendevo interruttore! –

+0

Felice di aiutare! A proposito, "votare" per le buone risposte è un buon modo per mostrare il tuo apprezzamento ;-) – AssafR

1

Per capovolgere i bit, è possibile utilizzare l'operatore OR bit a bit esclusivo. Ciò richiede due operandi (in genere, il valore su cui si desidera operare e la maschera che definisce quali bit saranno capovolti). L'operatore XEX (eXclusive OR) capovolgerà solo un bit se, e solo se, uno dei due è impostato su 1, ma NON entrambi. Vedere la (semplice) esempio qui sotto:

#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    int num = 7; //00000111 
    int mask = 3; //00000011 

    int result = num^mask; //00000100 
    printf("result = %d\n", result); //should be 4 

    return 0; 
} 
2

Se il byte è x, e si desidera passare i bit alla i-esimo e j-esima posizione:

x = x^((1<<i) | (1<<j)); 

Così, nella vostra caso, sarebbe solo (1 < < 4) | (1 < < 7). :)