Подтвердить что ты не робот

Как перенести определенный бит в байт в C?

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

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

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

4b9b3361

Ответ 1

Перевертывание бит выполняется с помощью XOR-ing с помощью маски: установите бит в положениях, которые вы хотите перевернуть, а затем выполните 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) (1 << 4) | (1 << 7) создает маску для перевернутых битов 4 и 7.

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Чтобы перевернуть биты, вы можете использовать исключающий или побитовый оператор. Это занимает два операнда (обычно это значение, на которое вы хотите работать, и маска, определяющая, какие биты будут перевернуты). Оператор 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;
}