Toán tử Bitwise C ++

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về các toán tử bitwise trong C ++ với sự trợ giúp của các ví dụ.

Trong C ++, toán tử bitwise thực hiện các thao tác trên dữ liệu số nguyên ở cấp độ bit riêng lẻ. Các hoạt động này bao gồm kiểm tra, thiết lập hoặc dịch chuyển các bit thực tế. Ví dụ,

 a & b; a | b;

Đây là danh sách 6 toán tử bitwise có trong C ++.

Nhà điều hành Sự miêu tả
& Bitwise AND toán tử
| Bitwise HOẶC Toán tử
^ Toán tử XOR Bitwise
~ Toán tử bổ sung Bitwise
<< Bitwise Shift Left Operator
>> Bitwise Shift Right Operator

Các toán tử này là cần thiết vì Đơn vị số học-lôgic (ALU) hiện diện trong CPU của máy tính thực hiện các phép toán số học ở cấp độ bit.

Lưu ý: Các toán tử bitwise chỉ có thể được sử dụng cùng với charintcác kiểu dữ liệu.

1. Toán tử C ++ Bitwise AND

Các phép toán AND & điều hành lợi nhuận 1 khi và chỉ khi cả hai toán hạng là 1 . Nếu không, nó trả về 0 .

Bảng sau đây trình bày hoạt động của toán tử AND bitwise . Cho ab là hai toán hạng chỉ có thể nhận các giá trị nhị phân tức là 1 và 0 .

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

Lưu ý: Bảng trên được gọi là "Bảng Chân lý" cho toán tử AND bitwise .

Chúng ta hãy xem xét phép toán bitwise AND của hai số nguyên 12 và 25:

 12 = 00001100 (Trong nhị phân) 25 = 00011001 (Trong nhị phân) // Bitwise AND Hoạt động của 12 và 25 00001100 & 00011001 _________ 00001000 = 8 (Trong thập phân)

Ví dụ 1: Bitwise 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; )

Đầu ra

 a = 12 b = 25 a & b = 8

Trong ví dụ trên, chúng ta đã khai báo hai biến a và b. Ở đây, hãy để ý dòng,

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

Ở đây, chúng tôi đang thực hiện bitwise AND giữa các biến a và b.

2. Toán tử C ++ Bitwise HOẶC

Các Bitwise OR | điều hành trở về 1 nếu ít nhất một trong các toán hạng là 1 . Nếu không, nó trả về 0 .

Bảng sự thật sau đây chứng minh hoạt động của toán tử OR bitwise . Cho ab là hai toán hạng chỉ có thể nhận các giá trị nhị phân tức là 1 hoặc 0 .

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

Chúng ta hãy xem xét phép toán OR bitwise của hai số nguyên 1225 :

12 = 00001100 (Ở chế độ nhị phân) 25 = 00011001 (Ở dạng nhị phân) Hoạt động theo chiều bit HOẶC của 12 và 25 00001100 | 00011001 _________ 00011101 = 29 (Theo số thập phân)

Ví dụ 2: Bitwise HOẶC

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

Đầu ra

a = 12 b = 25 a | b = 29

Các Bitwise OR của a = 12b = 25cung cấp cho 29.

3. Toán tử C ++ Bitwise XOR

Các Bitwise XOR ^ điều hành trả về 1 nếu và chỉ nếu một trong các toán hạng là 1 . Tuy nhiên, nếu cả hai toán hạng đều là 0 hoặc nếu cả hai đều là 1 , thì kết quả là 0 .

Bảng sự thật sau đây chứng minh hoạt động của toán tử XOR bitwise . Cho ab là hai toán hạng chỉ có thể nhận các giá trị nhị phân tức là 1 hoặc 0 .

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

Chúng ta hãy xem xét phép toán XOR bitwise của hai số nguyên 12 và 25:

 12 = 00001100 (Trong nhị phân) 25 = 00011001 (Trong nhị phân) Hoạt động XOR theo chiều bit của 12 và 25 00001100 00011001 _________ 00010101 = 21 (Trong thập phân)

Ví dụ 3: Bitwise 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; )

Đầu ra

 a = 12 b = 25 a b = 21

Các XOR Bitwise của a = 12b = 25cung cấp cho 21.

4. Toán tử bổ sung bitwise C ++

Toán tử bổ sung bitwise là một toán tử một ngôi (chỉ hoạt động trên một toán hạng). Nó được biểu thị bằng cách ~thay đổi các chữ số nhị phân 1 thành 00 thành 1 .

Bổ sung Bitwise

Điều quan trọng cần lưu ý là phần bù bit của bất kỳ số nguyên N nào cũng bằng - (N + 1) . Ví dụ,

Xét một số nguyên 35 . Theo quy tắc, phần bù theo bit của 35 phải là - (35 + 1) = -36 . Bây giờ, hãy xem chúng ta có nhận được câu trả lời chính xác hay không.

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

Khi chúng ta chuyển bất kỳ số nào sang phải, các bit ít quan trọng nhất sẽ bị loại bỏ, trong khi các bit quan trọng nhất được thay thế bằng các số 0.

một chút Shift phải

Như chúng ta có thể thấy từ hình trên, chúng ta có một số 4 bit . Khi chúng ta thực hiện thao tác dịch sang phải một bit trên nó, mỗi bit riêng lẻ sẽ được dịch sang phải 1 bit.

Do đó, bit ngoài cùng bên phải bị loại bỏ, trong khi bit ngoài cùng bên trái vẫn bị bỏ trống. Chỗ trống này được thay thế bằng số 0 .

6. Toán tử Shift trái trong C ++

Các nhà khai thác dịch trái chuyển tất cả các bit về phía bên trái, bởi một số lượng nhất định các bit quy định . Nó được ký hiệu là <<.

Shift trái một chút

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 

Do đó, phép toán sang trái theo chiều dọc bit đối với 13 (và bất kỳ số nào khác) có thể khác nhau tùy thuộc vào số lượng bit mà chúng được biểu diễn.

Bởi vì trong biểu diễn 32 bit , có nhiều bit hơn có thể được dịch chuyển sang trái khi so sánh với biểu diễn 4 bit .

thú vị bài viết...