Tiếp tục:
5. Phép dịch trái (Shl): x Shl i cho gái trị nhận được từ số nguyên x sau khi dịch số đó qua trái i bit.
Quy tắc: Muốn nhân 1 số với 2 ta dịch số đó qua trái 1 bit. Tổng quát, muốn nhân một sốnguyene với 2^i ta dịch số đó qua trái i bit;
x Shl i= x*n; với n=2^i
Trong C không hỗ trợ phép toán này nhưng có thể dùng phép chia nguyên cho 2^i để thực hiện
Thí dụ
6. Phép dịch phảiC Code:
Chỉ để minh họa { chả x, y; x=19;//x=00010011// y=x Shl 2;//y=01001100=x*4=76// }
(Tương tự như phép dịch trái nhưng số nguyên sẽ được dịch sang phải i bit)
MỘT SỐ ỨNG DỤNG
*Ứng dụng 1(lấy bit). Viết hàm getbit(x,i) cho giá trị của bit thứ i(tính từ phải sang) của số nguyên x.
*Ứng dụng 2(lấy số) Viết hàm GetNum(x, j, i) cho số tạo bởi các bit tính từ trái qua phải là bit thứ j đến bit thứ i (j>=i). Thí dụC Code:
char Getbit(char x, i) { return (x Shr i) && 1; }
GetNum(103,5,1)=19 vì 103=0000 0000 0110 0111
do dó GetNum(103,5,1)= 0000 0000 0001 0011 =19
Bài giải: Gọi số lượng bit của x là L(x) , trước hết ta phải hóa 0 các bit nằm ở bên trái bit thứ j. Muốn vậy ta dịch x qua trái k= L(x)-1-j bit. Sau đó ta chuyển giá trị thu được về cấu hình ban đầu tức là dịch phải k bit rồi tiếp tục dịch phải i bit để thu được số cần tìm. Hàm sizeof(x) cho ta số byte trong x. Nhân giá trị này với 8 ta sẽ được số bit trong x. Vì phép nhân 8 tương đuơng với phép dịch trái 3 bit nên sizeof(x) Shl 3 cho ta số bit trong x. Vì các bit được mã số từ phải sang trái bắt đầu từ bit 0 cho nên số hiệu cao nhất trong x sẽ là sizeof(x) Shl 3 -1
Đối với 2 hàm Getbit và GetNum ở trên ta sé có được một số ứng dụng như chuyển từ số tự nhiên sang biểu diễn nhị phân, thập lục phân, bát phân.C Code:
char Getnum(char x, j, i) { char k; k= (sizeof(x) Shl 3)-1-j return x Shl k Shr k Shr i; }
Ngoài ra dựa vào các phép toán logic cơ bản này ta có thể có một số ứng dụng khác như:
-viết hàm biểu diễn dưới dạng nhị phân mà không có số 0 thừa ở đầu
-Viết hàm đảo trật tự các bit trong 1 số ví dụ: 1011 (11) tahnhf 1101(13)
(Bài tiếp theo: Cách bật tắt các bit trong một số nguyên)