MÃ MÀU PALETTE PALETTE
1.5.2 Các phép toán trên BIT và kĩ thuật mặt nạ.
Trong C có 6 phép toán thao tác bit, được sắp theo thứ tự ưu tiên từ trái qua phải: ~, >>, <<, &, ^, |
Phép toán phủ định. Kí hiệu: ‘~’.
Đây là phép toán một ngôi – còn được gọi là phép toán đảo bit. Phép toán cho lại một giá trị nguyên (int , long) là phần bù 1 của toán hạng của nó. Giá trị của từng bit sau khi đi qua phép toán là giá trị đảo ngược của giá trị ban đầu.
Phép toán hoặc. Kí hiệu ‘|’ .
Khi thực hiện phép hoặc hai toán hạng, thực hiện từng cặp bit tương ứng (hai bit có cùng vị trí). Kết quả là 0 khi cả hai bit cùng giá trị 0, trong các trường hợp còn lại cho giá trị 1.
Phép toán hoặc loại trừ. Kí hiệu ‘^’.
Khi thực hiện phép hoặc loại trừ hai toán hạng, thực hiện từng cặp bit tương ứng (hai bit có cùng vị trí). Kết quả là 0 khi cả hai bit cùng giá trị, kết quả là 1 khi hai bit khác giá trị.
Phép toán và. Kí hiệu ‘&’.
Khi thực hiện phép và hai toán hạng, thực hiện từng cặp bit tương ứng (hai bit có cùng vị trí). Kết quả là 1 khi cả hai bit cùng có giá trị 1, kết quả là 0 trong các trường hợp còn lại.
Phép toán dịch phải. Kí hiệu ‘>>’.
Thực hiện việc chuyển dịch các bit trong toán hạng bên trái đi một số vị trí sang bên phải. Số lượng vị trí cần dịch chuyển được xác định trong toán hạng bên phải của phép toán này. Các vị trí dôi ra ở phần đầu của kết quả nhận giá trị 0.
Phép toán dịch trái. Kí hiệu ‘<<’.
Thực hiện việc chuyển dịch các bit trong toán hạng bên trái đi một số vị trí sang bên trái. Số lượng vị trí cần dịch chuyển được xác định trong toán hạng bên phải của phép toán này. Các vị trí dôi ra ở bên phải của kết quả nhận giá trị 0.
Các phép toán trên bit được sử dụng để bật, tắt từng bit theo sự lựa chọn nào đó trong byte và không làm ảnh hưởng đến các byte khác (còn gọi là che mặt nạ) người ta gọi đó là kĩ thuật “mặt nạ”
A B A & B A | B A ^ B A ~A 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 0 A = 0x4 = 00000100 A>>=2 A=00000001 A<<=2 A=00010000 1.5.3 Tổ chức bộ nhớ màn hình (VidMem).
Địa chỉ đầu của vùng nhớ màn hình 0xB8000000. Các điểm trên dòng chẵn lưu trữ bắt đầu từ địa chỉ này.
Các điểm trên dòng lẻ lưu trữ bắt đầu từ địa chỉ cách địa chỉ đầu một khoảng DELTA = 8192 byte.
Để việc xử lí dòng lẻ như xử lí dòng chẵn ta lùi lại 40 byte (bằng đúng nửa dòng điểm trên màn hình).
#define DELTA 8152
Địa chỉ của byte đầu tiên của VidMem sẽ chứa trong 1 biến (ta đặt tên là VidMem) đây là biến thuộc kiểu con trỏ xa, có khai báo như sau:
char far *VidMem = (char far *)0xB8000000;
Như trên đã trình bày nếu biết toạ độ (x,y) trên màn hình vật lí sẽ tính được địa chỉ của nó trong VidMem (thuộc byte thứ mấy?). Công thức liên quan giữa toạ độ (x,y) màn hình với địa chỉ bộ nhớ tính như sau:
i = x * 40 + y/4 hoặc i = x*40 + (y>>2) (1)
x*40 (chứ không phải x*80) là vì trong x dòng có một nửa số dòng là dòng lẻ. y/4 là vì mỗi byte chứa 4 điểm.
Vậy byte i (trong công thức 1) là địa chỉ chứa điểm (x,y) trong VidMem. Byte i chứa 4 điểm, vậy điểm (x,y) là điểm nào trong byte i?
Để trả lời câu hỏi này ta sử dụng công thức:
p = y % 4 (2)
Đặt v = VidMem ( char far *v = VidMem) Nếu x%2==0 (điểm thuộc dòng chẵn) thì:
b = i + v là địa chỉ tuyệt đối của byte chứa điểm (x,y)
Nếu x%2==1 (điểm thuộc dòng lẻ) thì:
b = i + v + DELTA là địa chỉ tuyệt đối của byte chứa điểm (x,y).
Thao tác: b>>2*(3-p) sẽ đẩy 2 BIT màu của điểm đang xét về đầu phải của byte. Còn nếu c là byte chứa màu nào đó, thì: c<<2*(3-p) sẽ đặt màu c chắn đúng điểm đang xét.