цифровая электроника
вычислительная техника
встраиваемые системы

 
» » Простой макрос для манипуляции отдельными битами


Простой макрос для манипуляции отдельными битами

Автор: Mike(admin) от 20-04-2014, 12:00

Каждый, кто работал с низкоуровневыми регистрами, сталкивался с необходимостью устанавливать, сбрасывать и инвертировать отдельные биты, не влияя при этом на остальные. Это требует запоминания серии команд, включающих OR, AND и NOT, которые проще реализовать как макрос.


Нижеприведенный фрагмент кода реализует макрос для установки конкретного бита в лог. «1», сброса бита и его инвертирования, а также чтения значения бита.



/* Простой макрос для манипуляции с битами
   Не нужно вносить изменения
*/

//Установить бит y (отсчет с индекса 0) регистра x в '1'
// путем создания маски с '1' на месте нужного бита
// и логического сложения (OR) x с этой маской.

#define SET(x,y) x |= (1 << y)

// Установить бит y (отсчет с индекса 0) регистра x в '0'
// путем создания маски с '0' на месте нужного бита и '1'
// в остальных позициях с последующим логическим
// умножением (AND) маски на x.

#define CLEAR(x,y) x &= ~(1<< y)

//Вернуть '1', если значение бита в позиции y регистра x равно '1',
// и '0', если равно 0 путем умножения (AND) x на маску,
// где бит в позиции y равен '1', и '0' в любой другой позиции,
// и сравнивая все с нулями.  Вернуть '1' в позиции самого младшего бита,
// если значение бита равно '1', вернуть '0', если было равно '0'.

#define READ(x,y) ((0u == (x & (1<<y)))?0u:1u)

// Инвертировать бит y (отсчет с индекса 0) регистра x:
// '0' становится '1', '1' становится '0'
// путем применения операции исключающего ИЛИ (XOR)
// к регистру x с маской, где бит позиции y равен '1'
// и все остальные равны '0'.

#define TOGGLE(x,y) (x ^= (1<<y))




Перевод © digitrode.ru


<Источник>




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий