Bitové operátory C ++

V tomto tutoriálu se pomocí příkladů dozvíme o bitových operátorech v C ++.

V C ++ provádějí bitové operátory operace s celočíselnými daty na jednotlivé bitové úrovni. Mezi tyto operace patří testování, nastavení nebo posunutí skutečných bitů. Například,

 a & b; a | b;

Zde je seznam 6 bitových operátorů zahrnutých v C ++.

Operátor Popis
& Bitový operátor AND
| Bitový operátor OR
^ Bitový operátor XOR
~ Operátor bitového doplňku
<< Levý operátor bitového posunu
>> Operátor bitového posunu doprava

Tyto operátory jsou nezbytné, protože aritmeticko-logická jednotka (ALU) přítomná v CPU počítače provádí aritmetické operace na bitové úrovni.

Poznámka: Bitové operátory mohou být použity pouze po boku chara intdatové typy.

1. C ++ bitový operátor AND

Tyto bitové AND & operátor vrací 1 právě tehdy, když oba operandy jsou 1 . V opačném případě vrátí 0 .

Následující tabulka ukazuje fungování bitového operátoru AND . Nechť a a b jsou dva operandy, které mohou nabývat pouze binární hodnoty, tj. 1 a 0 .

A b a & b
0 0 0
0 1 0
1 0 0
1 1 1

Poznámka: Výše uvedená tabulka je známá jako „tabulka pravdy“ pro bitový operátor AND .

Pojďme se podívat na bitovou operaci AND dvou celých čísel 12 a 25:

 12 = 00001100 (v binárním formátu) 25 = 00011001 (v binárním formátu) // bitový AND provoz 12 a 25 00001100 a 00011001 _________ 00001000 = 8 (v desítkové soustavě)

Příklad 1: Bitové AND

 #include using namespace std; int main() ( // declare variables int a = 12, b = 25; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "a & b = " << (a & b) << endl; return 0; )

Výstup

 a = 12 b = 25 a & b = 8

Ve výše uvedeném příkladu jsme deklarovali dvě proměnné a a b. Tady si všimněte řádku

 cout << "a & b = " << (a & b) << endl;

Zde provádíme bitové AND mezi proměnnými a a b.

2. C ++ bitový operátor OR

Tyto bitové OR | operátor vrací 1 , pokud alespoň jeden z operandů je 1 . V opačném případě vrátí 0 .

Následující tabulka pravdivosti ukazuje fungování bitového operátoru OR . Nechť a a b jsou dva operandy, které mohou nabývat pouze binární hodnoty, tj. 1 nebo 0 .

A b a | b
0 0 0
0 1 1
1 0 1
1 1 1

Podívejme se na bitovou operaci OR dvou celých čísel 12 a 25 :

12 = 00001100 (v binárním formátu) 25 = 00011001 (v binárním formátu) po bitech NEBO provoz 12 a 25 00001100 | 00011001 _________ 00011101 = 29 (v desítkové soustavě)

Příklad 2: Bitový OR

 #include int main() ( int a = 12, b = 25; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "a | b = " << (a | b) << endl; return 0; )

Výstup

a = 12 b = 25 a | b = 29

Bitový OR of a = 12a b = 25dává 29.

3. C ++ bitový operátor XOR

Bitový XOR ^ operátor vrací 1 právě tehdy, když jeden z operandů je 1 . Pokud jsou však oba operandy 0 nebo pokud jsou oba 1 , pak je výsledek 0 .

Následující tabulka pravdivosti demonstruje fungování bitového operátoru XOR . Nechť a a b jsou dva operandy, které mohou nabývat pouze binární hodnoty, tj. 1 nebo 0 .

A b a b
0 0 0
0 1 1
1 0 1
1 1 0

Podívejme se na bitovou operaci XOR dvou celých čísel 12 a 25:

 12 = 00001100 (v binárním formátu) 25 = 00011001 (v binárním formátu) Bitový provoz XOR 12 a 25 00001100 00011001 _________ 00010101 = 21 (v desítkovém formátu)

Příklad 3: Bitový XOR

 #include int main() ( int a = 12, b = 25; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "a b = " << (a b) << endl; return 0; )

Výstup

 a = 12 b = 25 a b = 21

Bitový XOR of a = 12a b = 25dává 21.

4. Operátor bitového doplňku C ++

Operátor bitového doplňku je unární operátor (funguje pouze na jednom operandu). Označuje se tím, ~že se mění binární číslice 10 a 01 .

Bitový doplněk

Je důležité si uvědomit, že bitový doplněk jakéhokoli celého čísla N se rovná - (N + 1) . Například,

Zvažte celé číslo 35 . Podle pravidla by bitový doplněk 35 měl být - (35 + 1) = -36 . Nyní se podívejme, zda dostaneme správnou odpověď, nebo ne.

 35 = 00100011 (In Binary) // Using bitwise complement operator ~ 00100011 __________ 11011100

In the above example, we get that the bitwise complement of 00100011 (35) is 11011100. Here, if we convert the result into decimal we get 220.

However, it is important to note that we cannot directly convert the result into decimal and get the desired output. This is because the binary result 11011100 is also equivalent to -36.

To understand this we first need to calculate the binary output of -36. We use 2's complement to calculate the binary of negative integers.

2's Complement

The 2's complement of a number N gives -N.

In binary arithmetic, 1's complement changes 0 to 1 and 1 to 0.

And, if we add 1 to the result of the 1's complement, we get the 2's complement of the original number.

For example,

 36 = 00100100 (In Binary) 1's Complement = 11011011 2's Complement : 11011011 + 1 _________ 11011100 

Here, we can see the 2's complement of 36 (i.e. -36) is 11011100. This value is equivalent to the bitwise complement of 35 that we have calculated in the previous section.

Hence, we can say that the bitwise complement of 35 = -36.

Example 4: Bitwise Complement

 #include int main() ( int num1 = 35; int num2 = -150; cout << "~(" << num1 << ") = " << (~num1) << endl; cout << "~(" << num2 << ") = " << (~num2) << endl; return 0; )

Output

 ~(35) = -36 ~(-150) = 149

In the above example, we declared two integer variables num1 and num2, and initialized them with the values of 35 and -150 respectively.

We then computed their bitwise complement with the codes (~num1) and (~num2) respectively and displayed them on the screen.

 The bitwise complement of 35 = - (35 + 1) = -36 i.e. ~35 = -36 The bitwise complement of -150 = - (-150 + 1) = - (-149) = 149 i.e. ~(-150) = 149

This is exactly what we got in the output.

C++ Shift Operators

There are two shift operators in C++ programming:

  • Right shift operator >>
  • Left shift operator <<

5. C++ Right Shift Operator

The right shift operator shifts all bits towards the right by a certain number of specified bits. It is denoted by >>.

Když posuneme libovolné číslo doprava, nejméně významné bity jsou zahozeny, zatímco nejvýznamnější bity jsou nahrazeny nulami.

jeden bit Right Shift

Jak vidíme z obrázku výše, máme 4bitové číslo . Když na něm provádíme jednobitovou operaci posunu doprava, každý jednotlivý bit je posunut doprava o 1 bit.

Výsledkem je, že bit zcela vpravo je vyřazen, zatímco bit nejvíce vlevo zůstává prázdný. Toto volné místo je nahrazeno 0 .

6. Operátor levého posunu C ++

Operátor levý shift posune všechny bity doleva od určitého počtu uvedených bitů . Označuje to <<.

jeden bit Levý Shift

As we can see from the image above, we have a 4-bit number. When we perform a 1 bit left shift operation on it, each individual bit is shifted to the left by 1 bit.

As a result, the left-most bit is discarded, while the right-most bit remains vacant. This vacancy is replaced by a 0.

Example 5: Shift Operators

 #include int main() ( // declaring two integer variables int num = 212, i; // Shift Right Operation cout << "Shift Right:" << endl; // Using for loop for shifting num right from 0 bit to 3 bits for (i = 0; i < 4; i++) ( cout <> " << i << " = " <> i) << endl; ) // Shift Left Operation cout << "Shift Left:" << endl; // Using for loop for shifting num left from 0 bit to 3 bits for (i = 0; i < 4; i++) ( cout << "212 << " << i << " = " << (212 << i) << endl; ) return 0; )

Output

 Shift Right: 212>> 0 = 212 212>> 1 = 106 212>> 2 = 53 212>> 3 = 26 Shift Left: 212 << 0 = 212 212 << 1 = 424 212 << 2 = 848 212 << 3 = 1696

From the output of the program above, we can infer that, for any number N, the results of the shift right operator are:

 N>> 0 = N N>> 1 = (N>> 0) / 2 N>> 2 = (N>> 1) / 2 N>> 3 = (N>> 2) / 2

and so on.

Similarly, the results of the shift left operator are:

 N << 0 = N N << 1 = (N << 0) * 2 N << 2 = (N << 1) * 2 N << 3 = (N << 2) * 2

and so on.

Hence we can conclude that,

 N>> m = ( N>> (m-1) ) / 2 N << m = ( N << (m-1) ) * 2

In the above example, note that the int data type stores numbers in 32-bits i.e. an int value is represented by 32 binary digits.

However, our explanation for the bitwise shift operators used numbers represented in 4-bits.

For example, the base-10 number 13 can be represented in 4-bit and 32-bit as:

 4-bit Representation of 13 = 1101 32-bit Representation of 13 = 00000000 00000000 00000000 00001101 

Výsledkem je, že bitová operace levého posunu pro 13 (a jakékoli jiné číslo) se může lišit v závislosti na počtu bitů, kterými jsou reprezentovány.

Protože v 32bitové reprezentaci existuje mnohem více bitů, které lze ve srovnání se 4bitovou reprezentací posunout doleva .

Zajímavé články...