Битовые операции, работа с определенным полем - C (СИ)
Формулировка задачи:
Все прочитал внимательно несколько раз, пересмотрел кучу видосов, однако остаются не понятыми несколько тривиальных но в то же время фундаментальных вещей.
допустим есть число
как теперь их вставить в число x без потери остальных битов, не могу понять.
int p = 4; int n = 4; unsigned x = 4010; //1111 1010 1010
в x надо инвертировать n битов, начиная с позиции p
(тобишь получить число 3930 (11110101
1010)) Я смог получить инвертированное и не инвертированное значение группы искомых битовint temp = ((~(x>>p)<<p) & ~(~0<<(p+n))); // инвертированное 0000 0101 0000 int temp = (((x>>p)<<p) & ~(~0<<(p+n))); // не инвертированное 0000 1010 0000
Решение задачи: «Битовые операции, работа с определенным полем»
textual
Листинг программы
unsigned invert(unsigned x, int p, int n) { return x ^ ((~(~0<<(p+n)))>>p)<<p; }
Объяснение кода листинга программы
- Функция invert принимает три аргумента: x, p, n.
- Вычисляется выражение ~(~0<<(p+n)).
- Результат выражения (~(~0<<(p+n))))>>p.
- Результат выражения x ^ ((~(~0<<(p+n)))>>p).
- Результат выражения ((~(~0<<(p+n)))>>p)<<p.
- Возвращаемое значение - это результат последнего выражения.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д