Operatory binarne
Operatory binarne działają na podstawowej, najmniejszej jednostce informacji cyfrowej, czyli pojedynczym bicie.
Tabela prawdy dla operacji bitowych
a | b | AND a&b | OR a|b | XOR a^b | NOT ~a | NAND ~(a&b) |
0 | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 | 0 | 0 | 0 |
Operator binarny AND &
Porównując dwa łańcuchy znaków binarnych o takiej samej długości, operator binarny AND zwraca prawdę (wartość 1) dla bitów, które w obu łańcuchach miały wartość 1.
byte val1 = 0b0101;
byte val2 = 0b0011;
byte result = val1 & val2; // wynik 0b1
Sprawdzanie czy liczba jest parzysta / nieparzysta
W liczbie parzystej bit nr 0 wynosi 0, a w nieparzystej 1.
Na liczbie wykonuje się operację bitową AND z liczbą 1. Jeśli wynikiem jest 1 to liczba jest nieparzysta, a jeśli jest 0 to jest parzysta.
Operator binarny OR |
Zwraca wartość 1 wtedy, gdy choć jeden z porównywanych bitów w łańcuchach binarnych ma wartość 1.
byte val1 = 0b0101;
byte val2 = 0b0011;
byte result = val1 | val2; // wynik 0b111
Operator binarny XOR ^
zwraca wartość 1 wtedy, gdy wartości porównywanych bitów w łańcuchach binarnych są różne. [^ kareta]
byte val1 = 0b0101;
byte val2 = 0b0011;
byte result = val1 ^ val2; // wynik 0b110
Operator binarny NOT~
Odwraca wartość pojedynczego łańcucha bitów [~ tylda]
byte val1 = 0b0011;
byte result = ~val1; // wynik 0b1100
Operator binarny NAND ~& (Not AND)
byte val1 = B11001001;
byte val2 = B01100011;
byte result = ~(val1 & val2); // wynik 0b10111110
SHIFT << >>
Operator Shift (w uproszczeniu) służy do przesuwania bitów.
Operator Shift zachowuje się inaczej w przypadku liczb dodatnich i ujemnych. Tutaj będziemy się zajmować liczbami dodatnimi, dlatego uznajmy, że podczas przesuwania bitów, dokładane bity będą wypełniane zerami.
MSB (most significant bit) to bit reprezentujący największą wartość (z lewej strony),
LSB (least significant bit) to bit reprezentujący najmniejszą wartość (z prawej strony).
Przykłady przesunięć:
byte val1 = 0b00000011;
Serial.println(val1 << 2,BIN); // wynik: 0b1100
byte val1 = 0b00001001;
Serial.println(val1 >> 3,BIN); // wynik: 0b00000001
Wzór określający wartości liczbowe podczas przesunięć bitowych
n << k = n x 2k
Złączenie dwóch ciągów binarnych w jeden
void setup() {
Serial.begin(9600);
byte binary1 = 0b1011;
byte binary2 = 0b1011;
byte nowy = (binary1<<4)+binary2;
Serial.print(nowy,BIN);
}