Битовыми называют операции над цепочками битов. Основными битовыми операциями являются побитовые операции и битовые сдвиги.
Побитовые операции - это операции, которые применяются к каждому биту из цепочки битов. Основными побитовыми операциями являются побитовое отрицание 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.