Битовые операции, работа с определенным полем - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Все прочитал внимательно несколько раз, пересмотрел кучу видосов, однако остаются не понятыми несколько тривиальных но в то же время фундаментальных вещей. допустим есть число
int p = 4;
int n = 4;
unsigned x = 4010;       //1111 1010 1010

в x надо инвертировать n битов, начиная с позиции p

(тобишь получить число 3930 (1111

0101

1010)) Я смог получить инвертированное и не инвертированное значение группы искомых битов
int temp = ((~(x>>p)<<p) & ~(~0<<(p+n)));   // инвертированное 0000 0101 0000
int temp = (((x>>p)<<p) & ~(~0<<(p+n))); // не инвертированное 0000 1010 0000
как теперь их вставить в число x без потери остальных битов, не могу понять.

Решение задачи: «Битовые операции, работа с определенным полем»

textual
Листинг программы
unsigned invert(unsigned x, int p, int n)
{
  return x ^ ((~(~0<<(p+n)))>>p)<<p;
}

Объяснение кода листинга программы

  1. Функция invert принимает три аргумента: x, p, n.
  2. Вычисляется выражение ~(~0<<(p+n)).
  3. Результат выражения (~(~0<<(p+n))))>>p.
  4. Результат выражения x ^ ((~(~0<<(p+n)))>>p).
  5. Результат выражения ((~(~0<<(p+n)))>>p)<<p.
  6. Возвращаемое значение - это результат последнего выражения.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5
Похожие ответы