Một số chú ý về ' Bitwise Operator '

Một số chú ý về ' Bitwise Operator '
----------------------------------------------------
Các phép toán trên bit :
_bitwise AND ( & ) 
_bitwise OR ( | )
_bitwise XOR ( ^ )
_bitwise NOT ( ~ )
_left shift ( << )
_right shift ( >> )

Tóm tắt một chút :
1. Bitwise AND ( & )
Chú ý đây là phép toán chỉ áp dụng trên bit cần phân biệt với &&, đây là so sánh toán tử điều kiện
Bảng giá trị :
0 & 0 = 0 : 1 & 0 = 0 : 0 & 1 = 0 : 1 & 1 = 1
Ví dụ : 01101111 & 11110000 = 01100000
So sánh AND ( & ) từng bit tương ứng ( cùng vị trí hay vị trí tương ứng trong byte )
Thêm một ví dụ khác : 
$result = 124 & 99;
Chuyển sang hệ BIN, nhị phân.
124D = 01111100B
99D = 01100011B
D = Decimal : Hệ thập phân (base-10)
B = Binary : Hệ nhị phân (base-2)
So sánh từng vị trí bit trong byte theo AND ( & ) thu được
$result = 96 ( = 01100000B)

2.Các toán tử khác OR , XOR , NOT :
OR ( | ) : Bảng giá trị :
0 | 0 = 0 : 0 | 1 = 1 : 1 | 0 = 1 : 1 | 1 = 1
XOR ( ^ ) : Bảng giá trị :
0 ^ 0 = 0 : 0 ^ 1 = 1 : 1 ^ 0 = 1 : 1 ^ 1 = 0
NOT ( ~ ) :
~1 = 0 : ~0 = 1

3.Hai phép dịch bit : left-shift và right-shift :
Ví dụ : 
$result = $x >> 1 ;
mang ý nghĩa : các bit của $x dịch sang phải 1 bit. <hơi khó hiểu>. 
Cụ thể :
$result = 99 >> 1 ;
mang ý nghĩa : các bit của 99 dich sang phải 1 bit.
Từ từ thực hiện : 
chuyển sang hệ nhị phân (binary) : 99D = 01100011B [X]
dịch sang phải 1 bit tức là : 00110001 [Y]
So sánh 2 số tại [X] và [Y] để ý thấy :
từ [X] sang [Y] : bit cuối cùng biến mất và thêm vào đầu là 0 thay thế bit vị trí đầu tiên.
Có thể hiểu đơn giản : là xóa bit cuối cùng đi và lấp đầy khoảng trống ( thêm 0 vào đầu bit )
Kết quả : $result = 49 ( = 00110001B )
Tổng quát hơn : $result = $x >> n ;
mang ý nghĩa : dịch các bit của $x sang phải n bit ( = n vị trí ), thay thể các vị trí trống = 0
Các ví dụ trên dùng số nguyên 8-bit.
Với các bit lớn hơn 16-bit, 32-bit tương tự bạn chỉ cần thêm 0 cho đủ số bit tương ứng.
Một điều chắc chắn là : giả sử $x là số nguyên k-bit thì khi $x >> n với n >= k kết quả thu được luôn là 0.

Chú ý khác :
1). Để ý ví dụ sau :
$x = 17 >> 1;
$y = 16 >> 1;
So sánh $x và $y ?
17D = 00010001B;
16D = 00010000B;
Ái dà : kết quả thu được $x = $y = 8;
--> Cái này hay nhỉ 

2). Không nên dịch bit quá lớn, vượt quá giới hạn cho phép.
Giả sử bạn dùng 16-bit với phép tính : $result = 35000 << 1;
kết quả tính ra thu được 70000 , nghĩ là thế nhưng thực tế là lỗi
vì giới hạn 16-bit max = 65536.

3). Dịch bit và Lũy Thừa cơ số 2 : 
so sánh 2 cái này phát :
$x = 99 >> 1;
$y = 99 /2;
Kết quả : $x = $y = 49 ; bằng nhau
làm phép tính khác ;
$x = 99 << 1;
$y = 99 * 2;
Kết quả : $x = $y = 198; bằng nhau

Tóm lại có được quy luật chuyển bit 
_Dịch sang trái n bit với n là số nguyên dương thì tương đương với nhân với 2 lũy thừa n
_Dịch sang phải n bit với n là số nguyên dương thì tương đương với chia với 2 lũy thừa n

Thành ra dùng quy tắc chuyển dịch trên nhanh hơn cứ ngồi convert rồi dịch bit 
Kiến thức nho nhỏ, viết lại chia sẻ chút ^_^!

Written by Pete

Comments

Popular Posts