2013-10-27 3 views
13

Я пытаюсь использовать маски и манипулировать определенными битами в байте. Например:Как перенести определенный бит в байт в C?

Я хочу написать программу на C, которая переворачивает два бита в определенных положениях, например. бит в позиции 0 и тот, который находится в третьей позиции. Итак, 11100011, будет 01110011.

Как я могу поменять эти биты?

+1

Вы получите конкретный ответ на эту проблему, но логическую алгебру google и таблицы истинности google. –

ответ

15

листать бит выполняется XOR-ки с маской: набор битов в положениях, которые вы хотите, чтобы перевернуть, а затем выполнить операцию XOR, как это:

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

Вот несколько замечаний:

  1. биты обычно отсчитывается от наименьшего значимого положения, так что ваш пример переворачивается биты в положени х 4 и 7, а не в положениях 0 и 4
  2. для построения битовой маски для одной позиции, использовать выражение 1 << n, где n - это номер позиции, считанный от младшего значащего разряда.
  3. Чтобы комбинировать несколько бит в одной маске, используйте оператор |. Например, (1 << 4) | (1 << 7) создает маску для переворачивающих битов 4 и 7.
0

Прежде всего, удачи!

Одно замечание - полезно подсчитывать биты справа и слева, так как существуют различные размеры байтов/слов (8 бит, 16 бит и т. Д.), И этот счет лучше сохраняет совместимость. Таким образом, в вашем случае вы имеете в виду биты # 7 и # 4 (нуль-счет).

Возможно, вы имели в виду «flip» (изменить 0 < -> 1 бит) или «переключить» их между собой?

Для первого варианта ответ выше (XOR с «int mask = 0x90; // 10010000») очень хорош. Для второго, это немного сложнее (но не так много).

+0

Спасибо! Я имел в виду выключатель! –

+0

Рад помочь! Кстати, «голосование» за хорошие ответы - хороший способ показать свою признательность ;-) – AssafR

1

Чтобы перевернуть биты, вы можете использовать побитовый оператор исключительного ИЛИ. Это занимает два операнда (обычно это значение, на которое вы хотите работать, и маска, определяющая, какие биты будут перевернуты). Оператор eXclusive OR (XOR) будет только переворачивать бит, если и только если одно из двух установлено в 1, но НЕ оба. Смотрите (простой) пример ниже:

#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

Если байт х, и вы хотите, чтобы переключить биты в I-й и j-й позиции:

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

Таким образом, в вашем случае, это было бы просто (1 < < 4) | (1 < < 7). :)

Смежные вопросы