Битовыми называют операции над цепочками битов. Основными битовыми операциями являются побитовые операции и битовые сдвиги.

Побитовые операции - это операции, которые применяются к каждому биту из цепочки битов. Основными побитовыми операциями являются побитовое отрицание bitNot, побитовая конъюнкция bitAnd, побитовая дизъюнкция bitOr и побитовая строгая дизъюнкция bitXor.

Битовые и побитовые операции изучают разделе дискретной математики, а применяют в программировании, например, в обработке сигналов. В языке C++ определены следующие операции:

Symbol   Operator
 &    Побитовое И (умножение, конъюнкция) 
 |    Побитовое ИЛИ (дизъюнкция) 
 ^    Побитовое исключающее или XOR (строгая дизъюнкция, сложение по модулю 2)
 ~    Побитовое отрицание НЕ (дополнение). Унарная операция. 
 >>    Битовый сдвиг вправо. Деление на 2
 <<    Битовый сдвиг влево. Умножение на 2

Табл. 1.

Рис. 1.

// Сдвиг влево

void setup() {
  DDRD = 0b11111111;
  PORTD = 0b00001000;
}

void loop() {
    PORTD = PORTD << 1;
  delay(100);
}

Лист. 1.

// Кольцевой сдвиг влево

void setup() {
  DDRD = 0b11111111;
  PORTD = 0b00001000;
}

void loop() {
    PORTD = ((PORTD << 1) | (PORTD >> 7));
  delay(100);
}

Лист. 1.

// Кольцевой сдвиг от середины

void setup() {
  DDRD = 0b11111111;
  PORTD = 0b00011000;
}

void loop() {
  PORTD = (PORTD >> 1 & 0b00000111 | PORTD << 3 & 0b00001111) | (PORTD << 1 & 0b11100000 | PORTD >> 3 & 0b11110000); 
  delay(200);
}

Лист. 2.

// Кольцевой сдвиг

void setup() {
  DDRD = 0b11111111;
  PORTD = 0b00001000;
  pinMode(9,INPUT_PULLUP);
  pinMode(10,INPUT_PULLUP);
}

void loop() {
  int x=digitalRead(9);
  int y=digitalRead(10);
  if (x > y) {
    PORTD = ((PORTD << 1) | (PORTD >> 7));
  }
  if (x < y) {
    PORTD = ((PORTD >> 1) | (PORTD << 7));
  }
  delay(100);
}


Лист. 3.

// Сдвиг от/в середину

void setup() {
  DDRD = 0b11111111;
  PORTD = 0b00011000;
  pinMode(9,INPUT_PULLUP);
  pinMode(10,INPUT_PULLUP);
}

void loop() {
  int x=digitalRead(9);
  int y=digitalRead(10);
  if (x > y) {
    PORTD = (PORTD >> 1 & 0b00000111 | PORTD << 3 & 0b00001111) | (PORTD << 1 & 0b11100000 | PORTD >> 3 & 0b11110000); 
  }
  if (x < y) {
    PORTD = ((PORTD & 0b00000111) << 1 | (PORTD & 0b00001111) >> 3) | ((PORTD & 0b11100000) >> 1 | (PORTD & 0b11110000) << 3);
  }
  delay(200);
}

Лист. 4.