Побітові оператори C ++

У цьому посібнику ми дізнаємося про побітові оператори в C ++ за допомогою прикладів.

У C ++ побітові оператори виконують операції з цілими даними на індивідуальному рівні бітів. Ці операції включають тестування, встановлення або зміщення фактичних бітів. Наприклад,

 a & b; a | b;

Ось список 6 побітових операторів, включених до C ++.

Оператор Опис
& Побітове та оператор
| Побітове АБО Оператор
^ Побітовий оператор XOR
~ Оператор бітового доповнення
<< Побітове зсув лівого оператора
>> Побітове зсув оператора вправо

Ці оператори необхідні, оскільки арифметико-логічний блок (ALU), присутній у центральному процесорі комп'ютера, виконує арифметичні операції на рівні бітів.

Примітка: Бітові оператори можуть бути використані тільки разом charі intтипами даних.

1. Побітове та оператор C ++

У побітовое І & оператор повертає 1 , якщо і тільки якщо обидва операнда 1 . В іншому випадку він повертає 0 .

Наступна таблиця демонструє роботу побітового оператора І. Нехай a і b - два операнди, які можуть приймати лише двійкові значення, тобто 1 і 0 .

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

Примітка: Наведена вище таблиця відома як "таблиця правди" для побітового оператора І.

Давайте подивимося на побітове операцію І двох цілих чисел 12 і 25:

 12 = 00001100 (у двійковому) 25 = 00011001 (у двійковому) // побітове І Операція 12 та 25 00001100 & 00011001 _________ 00001000 = 8 (у десятковому)

Приклад 1: Побітове І

 #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; )

Вихідні дані

 a = 12 b = 25 a & b = 8

У наведеному вище прикладі ми оголосили дві змінні a і b. Тут зверніть увагу на рядок,

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

Тут ми виконуємо побітове І між змінними a та b.

2. С ++ побітове АБО Оператор

У побітовое АБО | оператор повертає 1 , якщо принаймні один з операндів 1 . В іншому випадку він повертає 0 .

Наступна таблиця істинності демонструє роботу побітового оператора АБО . Нехай a і b - два операнди, які можуть приймати лише двійкові значення, тобто 1 або 0 .

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

Давайте розглянемо розрядні операції АБО двох цілих чисел 12 і 25 :

12 = 00001100 (у двійковому) 25 = 00011001 (у двійковому) Побітове АБО Операція 12 та 25 00001100 | 00011001 _________ 00011101 = 29 (у десяткових)

Приклад 2: Побітове АБО

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

Вихідні дані

a = 12 b = 25 a | b = 29

Побітове АБО з a = 12і b = 25дає 29.

3. С ++ побітовий оператор XOR

Побітове виключає ^ АБО оператор повертає 1 , якщо і тільки якщо один з операндів 1 . Однак, якщо обидва операнди дорівнюють 0 або якщо обидва дорівнюють 1 , то результат дорівнює 0 .

Наступна таблиця істинності демонструє роботу побітового оператора XOR . Нехай a і b - два операнди, які можуть приймати лише двійкові значення, тобто 1 або 0 .

a b а б
0 0 0
0 1 1
1 0 1
1 1 0

Давайте розглянемо побітову операцію XOR двох цілих чисел 12 і 25:

 12 = 00001100 (у двійковому) 25 = 00011001 (у двійковому) Побітове XOR Операція 12 та 25 00001100 00011001 _________ 00010101 = 21 (у десятковому)

Приклад 3: Побітове 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; )

Вихідні дані

 a = 12 b = 25 a b = 21

Побітове виключає з a = 12і b = 25дає 21.

4. Оператор бітового доповнення C ++

Побітовий оператор доповнення є унарним оператором (працює лише на одному операнді). Він позначається тим, ~що змінює двійкові цифри від 1 до 0 та від 0 до 1 .

Побітове доповнення

Важливо зазначити, що розрядне доповнення будь-якого цілого числа N дорівнює - (N + 1) . Наприклад,

Розглянемо ціле число 35 . Згідно з правилом, побітове доповнення 35 має бути - (35 + 1) = -36 . А тепер давайте подивимось, чи отримаємо ми правильну відповідь чи ні.

 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 >>.

Коли ми зміщуємо будь-яке число вправо, найменш значущі біти відкидаються, тоді як найбільш значущі біти замінюються нулями.

один біт зрушення вправо

Як ми бачимо із зображення вище, ми маємо 4-бітове число . Коли ми виконуємо на ньому однобітову операцію зсуву вправо, кожен окремий біт зміщується вправо на 1 біт.

В результаті крайній правий біт відкидається, а самий лівий біт залишається вакантним. Ця вакансія замінюється на 0 .

6. Оператор лівого зсуву C ++

Оператор зсуву вліво переміщує всі біти в напрямку вліво на певну кількість зазначених бітів . Він позначається <<.

один біт лівого зсуву

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 

Як результат, побітова операція зсуву вліво для 13 (і будь-якого іншого числа) може бути різною залежно від кількості бітів, якими вони представлені.

Оскільки в 32-розрядному поданні є набагато більше бітів, які можна зсунути вліво в порівнянні з 4-розрядним поданням.

Цікаві статті...