Thứ Bảy, 5 tháng 3, 2016

Phép toán trên bit (bitwise) trong ngôn ngữ lập trình C

Các toán tử này được sử dụng đến tính toán trên các số nguyên bằng cách tính toán trên các bit. Các toán tử hội bit, tuyển bit, tuyển loại bit và phủ định bit được tính như sau: chúng ta chuyển đổi các số thập phân sang nhị phân tương ứng, sau đó sử dụng các phép toán tương ứng cho từng bit theo vị trí của nó.


Ví dụ: như ở trên 210=102, 310=112 và ta sẽ thực hiện các phép toán tương ứng với từng bit. Bit thứ nhất (từ phải sang trái) là 0&1=1, bit thứ hai 1&1=1, như vậy kết quả của phép toán 2&3 là 112 hay 310.
Tương tự cho các phép toán còn lại. Nếu hai số có độ dài bit khác nhau, thì ta chỉ việc bổ sung thêm 0 ở số có độ dài bit ngắn hơn, sau đó thực hiện các phép toán như đã nêu.
Ở đây bạn lưu ý rằng phép toán tuyển loại sẽ có chân trị là 1 nếu hai bit tương ứng là khác nhau, nếu giống nhau thì tương ứng là 0(1^1=0^0=0, 1^0=0^1=1). Các phép toán hội, tuyển và phủ định vẫn còn đúng như phép toán hội, tuyển và phủ định trên kiểu dữ liệu logic.
Toán tử
Kết quả
~
Toán tử phủ định bit. Các bit 1 sẽ chuyển thành 0 và ngược lại.
Ví dụ. ~101=010.
&
Toán tử hội bit. Hội của hai bit 1 bằng 1. Trong mọi trường hợp còn lại, ta nhận được 0.
Ví dụ.
1
0
1
1
(tương ứng 11 trong hệ thập phân)
&
0
1
0
1
(tương ứng với 5 trong hệ thập phân)
0
0
0
1
(tương ứng với 1 trong hệ thập phân)
Nghĩa là 11&5=1.
|
Toán tử tuyển bit. Tuyển của hai bit 0 bằng 0. Trong mọi trường hợp còn lại, ta nhận được 1.
Ví dụ.
1
0
1
1
(tương ứng 11 trong hệ thập phân)
|
0
0
0
1
(tương ứng với 1 trong hệ thập phân)
1
0
1
1
(tương ứng với 11 trong hệ thập phân)
Nghĩa là 11|1=11.
^
Toán tử tuyển loại bit. Tuyển loại của hai bit khác nhau bằng 1. Trong mọi trường hợp còn lại, ta nhận được 0.
Ví dụ.
1
0
1
1
(tương ứng 11 trong hệ thập phân)
^
0
0
0
1
(tương ứng với 1 trong hệ thập phân)
1
0
1
0
(tương ứng với 10 trong hệ thập phân)
Nghĩa là 11^1=10.
>> 
Toán tử dịch bit sang phải. Dịch chuyển toàn bộ dãy bit sang phải theo số bit được chỉ định. Nếu là số dương, ta bổ sung các bit 0 vào đầu. Nếu là số âm, ta bổ sung các số 1 vào đầu.
Ví dụ.
Đối với số dương
0
1
0
1
1
(tương ứng 11 trong hệ thập
phân)
>> 
1
dịch sang phải 1 bit
0
0
1
0
1
(tương ứng với 5 trong hệ thập phân)
Nghĩa là 11>>1=5.
Đối với số âm
1
1
1
0
1
1
(tương ứng -11 trong hệ thập phân)
>> 
2
dịch sang phải 2 bit
1
1
1
1
1
0
(tương ứng -3 trong hệ thập phân)
Nghĩa là -11>>2=-3.
Các bạn cũng cần lưu ý rằng, trong các biểu diễn ở trên, nếu hệ thống được chọn là 32 bit, thì chúng ta cần lấp đầy số bit này:
- Nếu số dương thì các bit còn lại sẽ được bổ sung 0 vào phía trước.
- Nếu số âm thì các bit còn lại sẽ được bổ sung 1 vào phía trước.
Trong các ví dụ trên, phần dãy bit để trắng tương ứng với bit dấu – 1 tương ứng với – và 0 tương ứng với +.
<< 
Toán tử dịch bit sang trái. Dịch chuyển toàn bộ dãy bit sang trái theo số bit được chỉ định.
Ví dụ.
Đối với số dương
+
0
0
1
0
1
1
(tương ứng 11 trong hệ thập phân)
<< 
2
dịch sang trái 2 bit
1
0
1
1
0
0
(tương ứng 44 trong hệ thập phân)
Nghĩa là 11<<2=44.
&=
|=
^=
>>=
<<=
Các phép toán gán hợp nhất trên bit.



Các toán tử dịch trái bit << và dịch phải bit >> nếu thực hiện trực tiếp trên số nguyên hệ thập phân, sẽ được tính như sau: dịch trái tương đương vưới a*2b và dịch phải tương đương với a/2b.

Không có nhận xét nào:

Đăng nhận xét