Bitové Operators v C: AND, OR, XOR, Shift & Doplněk
Co jsou Bitwise Operators?
Bitové Operatorů se používají pro manipulaci s daty na bitové úrovni, nazývané také programování na bitové úrovni. Bitově pracuje s jedním nebo více bitovými vzory nebo binárními číslicemi na úrovni jejich jednotlivých bitů. Používají se v numerických výpočtech ke zrychlení procesu výpočtu.
Níže je uveden seznam bitových operátorů poskytovaných programovacím jazykem 'C':
| OperaTor | Význam |
|---|---|
| & | Bitový operátor AND |
| | | Bitový operátor OR |
| ^ | Bitový exkluzivní operátor OR |
| ~ | Binary One's Complement Operator je unární operátor |
| << | Operátor levé směny |
| >> | Operátor pravé směny |
Bitové operátory nelze přímo aplikovat na primitivní datové typy jako float, double atd. Vždy pamatujte na jednu věc, že bitové operátory se většinou používají s datovým typem integer kvůli jeho kompatibilitě.
Bitové logické operátory pracují s daty bit po bitu, počínaje nejméně významným bitem, tj. bitem LSB, což je bit nejvíce vpravo, směrem k MSB (Most Significant Bit), což je bit nejvíce vlevo.
Výsledek výpočtu bitových logických operátorů je uveden v tabulce níže.
| x | y | x & y | x | y | x^y |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Bitově A
Jedná se o jeden z nejčastěji používaných logických bitových operátorů. Je reprezentován jedním ampersandem (&). Na každou stranu operátoru (&) jsou zapsány dva celočíselné výrazy.
Výsledek bitové operace AND je 1, pokud oba bity mají hodnotu 1; jinak je výsledek vždy 0.
Uvažujme, že máme 2 proměnné op1 a op2 s následujícími hodnotami:
Op1 = 0000 1101 Op2 = 0001 1001
Výsledek operace AND na proměnných op1 a op2 bude
Result = 0000 1001
Jak vidíme, dvě proměnné se porovnávají bit po bitu. Kdykoli je hodnota bitu v obou proměnných 1, bude výsledek 1 nebo jinak 0.
Bitově NEBO
Je reprezentován jedním svislým pruhem (|). Na každou stranu operátoru (|) jsou zapsány dva celočíselné výrazy.
Výsledek bitové operace OR je 1, pokud alespoň jeden z výrazů má hodnotu 1; jinak je výsledek vždy 0.
Uvažujme, že máme 2 proměnné op1 a op2 s následujícími hodnotami:
Op1 = 0000 1101 Op2 = 0001 1001
Výsledek operace OR na proměnných op1 a op2 bude
Result = 0001 1101
Jak vidíme, dvě proměnné se porovnávají bit po bitu. Kdykoli je hodnota bitu v jedné z proměnných 1, bude výsledek 1 nebo jinak 0.
Bitwise Exclusive OR
Je reprezentován symbolem (^). Na každou stranu operátoru (^) jsou zapsány dva celočíselné výrazy.
Výsledek bitové operace Exclusive-OR je 1, pokud pouze jeden z výrazů má hodnotu 1; jinak je výsledek vždy 0.
Uvažujme, že máme 2 proměnné op1 a op2 s následujícími hodnotami:
Op1 = 0000 1101 Op2 = 0001 1001
Výsledek operace XOR na proměnných op1 a op2 bude
Result = 0001 0100
Jak vidíme, dvě proměnné se porovnávají bit po bitu. Kdykoli pouze jedna proměnná má hodnotu 1, pak je výsledek 0, jinak bude výsledkem 0.
Pojďme napsat jednoduchý program, který demonstruje bitové logické operátory.
#include <stdio.h>
int main()
{
int a = 20; /* 20 = 010100 */
int b = 21; /* 21 = 010101 */
int c = 0;
c = a & b; /* 20 = 010100 */
printf("AND - Value of c is %d\n", c );
c = a | b; /* 21 = 010101 */
printf("OR - Value of c is %d\n", c );
c = a ^ b; /* 1 = 0001 */
printf("Exclusive-OR - Value of c is %d\n", c );
getch();
}
Výstup:
AND - Value of c is 20 OR - Value of c is 21 Exclusive-OR - Value of c is 1
Operátory bitového posunu
Operátory bitového posunu se používají k pohybu/posouvání bitových vzorů buď doleva nebo doprava. Vlevo a vpravo jsou dva směnové operátory poskytované 'C“, které jsou zastoupeny takto:
Operand << n (Left Shift) Operand >> n (Right Shift)
Zde,
- operand je celočíselný výraz, na kterém musíme provést operaci posunu.
- 'n' je celkový počet bitových pozic, které musíme posunout v celočíselném výrazu.
Operace posunu doleva posune počet bitů 'n' doleva. Bity nejvíce vlevo ve výrazu budou vysunuty a n bitů s hodnotou 0 bude vyplněno na pravé straně.
Operace posunu doprava posune počet bitů 'n' na pravou stranu. Bity 'n' nejvíce vpravo ve výrazu se vysunou a na levé straně se vyplní hodnota 0.
Příklad: x je celočíselný výraz s daty 1111. Po provedení operace shift bude výsledek:
x << 2 (left shift) = 1111<<2 = 1100 x>>2 (right shift) = 1111>>2 = 0011
ShiftPokud lze operátory s kombinovat, lze je použít k extracdata z celočíselného výrazu. Napišme program, který demonstruje použití bitových operátorů posunu.
#include <stdio.h>
int main() {
int a = 20; /* 20 = 010100 */
int c = 0;
c = a << 2; /* 80 = 101000 */
printf("Left shift - Value of c is %d\n", c );
c = a >> 2; /*05 = 000101 */
printf("Right shift - Value of c is %d\n", c );
return 0;
}
Výstup:
Left shift - Value of c is 80 Right shift - Value of c is 5
Po provedení operace posunu doleva se hodnota stane 80, jejíž binární ekvivalent je 101000.
Po provedení operace posunu doprava se hodnota stane 5, jejíž binární ekvivalent je 000101.
Operátor bitového doplňku
Bitový doplněk se také nazývá operátor doplňku, protože vždy nabývá pouze jedné hodnoty nebo operandu. Jedná se o unární operátor.
Když provedeme doplněk na libovolných bitech, ze všech 1 se stanou 0 a naopak.
Pokud máme celočíselný výraz, který obsahuje 0000 1111, pak po provedení operace bitového doplňku bude hodnota 1111 0000.
Operátor bitového doplňku je označen symbolem vlnovka (~).
Pojďme napsat program, který demonstruje implementaci operátoru bitového doplňku.
#include <stdio.h>
int main() {
int a = 10; /* 10 = 1010 */
int c = 0;
c = ~(a);
printf("Complement - Value of c is %d\n", c );
return 0;
}
Výstup:
Complement - Value of c is -11
Zde je další program s příkladem všech dosud diskutovaných operátů:
#include <stdio.h>
main() {
unsigned int x = 48; /* 48 = 0011 0000 */
unsigned int y = 13; /* 13 = 0000 1101 */
int z = 0;
z =x & y; /* 0 = 0000 0000 */
printf("Bitwise AND Operator - x & y = %d\n", z );
z = x | y; /* 61 = 0011 1101 */
printf("Bitwise OR Operator - x | y = %d\n", z );
z= x^y; /* 61 = 0011 1101 */
printf("Bitwise XOR Operator- x^y= %d\n", z);
z = ~x; /*-49 = 11001111 */
printf("Bitwise One's Complement Operator - ~x = %d\n", z);
z = x << 2; /* 192 = 1100 0000 */
printf("Bitwise Left Shift Operator x << 2= %d\n", z );
z= x >> 2; /* 12 = 0000 1100 */
printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}
Poté, co program zkompilujeme a spustíme, vytvoří následující výsledek:
Bitwise AND Operator - x & y = 0 Bitwise OR Operator - x | y = 61 Bitwise XOR Operator- x^y= 61 Bitwise One's Complement Operator - ~x = -49 Bitwise Left Shift Operator x << 2= 192 Bitwise Right Shift Operator x >> 2= 12
Shrnutí
- Bitové operátory jsou speciální operátory, které poskytuje 'C.'
- Používají se při programování na úrovni bitů.
- Tyto operátory se používají k manipulaci s bity celočíselného výrazu.
- Logický, posun a doplněk jsou tři typy bitových operátorů.
- Operátor bitového doplňku se používá k obrácení bitů výrazu.
