Приветствую Вас ГостьПятница, 03.05.2024, 16:21

AVR & ARDUINO




Каталог статей

Главная » Статьи » Справочник

Побитовые операции

Побитовые операции выполняют свои расчеты на уровне битов переменных. Они помогают решить широкий спектр общих проблем программирования.

Побитовая операция И (&)

Побитовая операция И в Си обозначается символом амперсанда и используется между двумя целыми выражениями. Побитовое И действует в каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов. Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0:

0 0 1 1 операнд1
0 1 0 1 операнд2
----------
0 0 0 1 (операнд1 & операнд2) - результат

В Arduino тип INT представляет собой 16-битное значение, так что использование побитового И между двумя числами типа Int вызывает 16 одновременных операций. Например:

int a = 92; // в двоичном виде: 0000000001011100
int b = 101; // в двоичном виде: 0000000001100101
int c = a & b; // результат: 0000000001000100 или 68 в десятичном виде.

Каждый из 16 битов переменных a и b обработаны с использованием побитового И, и все 16 полученных бита сохраняются в переменной c, т.е. двоичное значение 01000100, которое в десятичной системе равно 68.

Наиболее часто побитовое И используют для получения конкретного бита (или битов) целого числа, называемое маскировкой. Ниже показан пример реализации маскировки.

Побитовая операция ИЛИ (|)

Побитовая операция ИЛИ обозначается вертикальной чертой (|). Как и операция &, операция | работает независимо для каждого бита между двумя целыми выражениями, но, естественно, со своей спецификой. Если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1:

0 0 1 1 операнд1
0 1 0 1 операнд2
----------
0 1 1 1 (операнд1 | операнд2) - результат

Пример использования побитового ИЛИ:

int a = 92; // в двоичном виде: 0000000001011100
int b = 101; // в двоичном виде: 0000000001100101
int c = a | b; // результат: 0000000001111101 или 125 в десятичном виде.

Пример

Совместная работа побитового И и ИЛИ - это то, что программисты называют чтение-изменение-запись порта (регистра). В микроконтроллерах порт является 8-битным числом, представляет собой состояние контактов. Запись в порт контролирует все контакты сразу.

PORTD - регистр порта D относится к выходным состояниям цифровых контактов 0,1,2,3,4,5,6,7. Если в битовой позиции стоит 1, то, в соответствующем контакте будет HIGH. (Контакты уже должны быть установлены в OUTPUT командой pinMode().) Таким образом, если мы установим PORTD = B00110001; мы сделаем контакты 2,3 и 7 HIGH. Надо отметить здесь один небольшой момент: возможно мы также изменили состояние контактов 0 и 1, которые используются на Arduino для последовательной связи.

Алгоритм нашей программы:

  • Получить PORTD и очистить только биты, соответствующие контактам, которые мы хотим контролировать (с помощью побитового И).
  • Объединение измененного значения PORTD с новым значением для контролируемых контактов (с помощью побитового ИЛИ).
int i; // счетчик
int j;

void setup(){
DDRD = DDRD | B11111100; // устанавливаем биты направления для 2-7 контактов
// через регистр направления DDRD
// 0 и 1 биты оставляем нетронутыми (xx | 00 == xx)
// можно было указать pinMode(pin, OUTPUT) для контактов 2-7
Serial.begin(9600);
}

void loop(){
for (i=0; i<64; i++){

PORTD = PORTD & B00000011; // очищаем биты 2-7, не трогаем 0 и 1
j = (i << 2); // смещаем переменную к контактам 2-7, чтобы не трогать 0 и 1
PORTD = PORTD | j; // совмещаем информацию с порта и новую информацию 
// для контактов со светодиодами
Serial.println(PORTD, BIN); // отладка для демонстрации маскировки
delay(100);
 }
}

Побитовая операция исключающее ИЛИ (^)

В Си существуетa несколько необычная операция побитовое исключающее ИЛИ, также известная как побитовое XOR. Побитовая операция исключающее ИЛИ записывается символом карет (^). Эта операция очень похожа на операцию ИЛИ |, отличие в том, что в результате будет 0, если оба входных бита в одной позиции являются 1:

0 0 1 1 операнд1
0 1 0 1 операнд2
----------
0 1 1 0 (операнд1 ^ операнд2) - результат

Иначе говоря, побитовое исключающее ИЛИ в результате будет 1, если входные биты разные, и 0, если они одинаковы.

Пример использования побитового исключающего ИЛИ:

int x = 12; // в двоичном виде: 1100
int y = 10; // в двоичном виде: 1010
int z = x ^ y; // в двоичном виде: 0110 или в десятичном 6

Операция ^ часто используется для переключения (т.е. изменение из0 в 1, или из 1 в 0) определенных битов в целом числе. При операции исключающего ИЛИ, если в маске бит равен 1, то в числе бит инвертируется, а если в маске бит равен 0, то бит остается неизменным. Ниже приведена программа мигающая цифровой 5 контактом.

// Blink_Pin_5
// Демо для исключающего ИЛИ
void setup(){
DDRD = DDRD | B00100000; // устанавливаем 5 контакт в режим OUTPUT 
Serial.begin(9600);
}

void loop(){
PORTD = PORTD ^ B00100000; // инвертируем 5 бит (контакт),
// остальные не трогаем
delay(100);
}

Смотрите также:

&& (логическое И)

|| (логическое ИЛИ)


Справочник

Материалы взяты с официального сайта проекта Arduino и представлены по лицензии Creative Commons Attribution-ShareAlike 3.0 License.



Источник: http://arduino.cc/en/Reference/BitwiseAnd
Категория: Справочник | Добавил: magi (10.11.2014)
Просмотров: 4201 | Теги: побитовые операции | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Поиск
Вход на сайт
На правах рекламы

Мы переезжаем на сайт Arduino по-русски