You are on page 1of 8

Trường Đại học Khoa học Tự nhiên &&

Khoa Công nghệ thông tin


Bộ môn Tin học cơ sở
VC
VC
BB
BB
Nội dung
NHẬP MÔN LẬP TRÌNH
Đặng Bình Phương
dbphuong@fit.hcmuns.edu.vn
1 Các toán tử logic

CÁC KỸ THUẬT 2 Các toán tử dịch bit

THAO TÁC TRÊN BIT


3 Các ứng dụng

4 Bài tập

1 NMLT - Các kỹ thuật thao tác trên bit 2

&& &&
VC
VC
BB
BB
Đơn vị đo thông tin VC
VC
BB
BB
Đơn vị đo thông tin
0
™Hai trạng thái tắt-0 và mở-1 (nhị phân). 1 bit 2
™Ký số nhị phân (Binary Digit) – bit
1 0
™bit - Đơn vị chứa thông tin nhỏ nhất.
2 bit 22
™Các đơn vị đo thông tin lớn hơn:
Tên gọi Ký hiệu Giá trị 2 1 0
Byte B 8 bit 3 bit 23
KiloByte KB 210 B = 1024 Byte
MegaByte MB 210 KB = 220 Byte
n-1 5 4 3 2 1 0
GigaByte GB 210 MB = 230 Byte n bit … 2n
TeraByte TB 210 GB = 240 Byte
PentaByte PB 210 TB = 250 Byte 0…000 Æ 1…111 = 2n – 1
NMLT - Các kỹ thuật thao tác trên bit 3 NMLT - Các kỹ thuật thao tác trên bit 4
&& &&
VC
VC
BB
BB
Biểu diễn thông tin trong MTĐT VC
VC
BB
BB
Biểu diễn số nguyên không dấu

™Đặc điểm ™Đặc điểm


ƒ Được lưu trong các thanh ghi hoặc trong các ô ƒ Biểu diễn các đại lương luôn dương.
nhớ. Thanh ghi hoặc ô nhớ có kích thước 1 ƒ Ví dụ: chiều cao, cân nặng, mã ASCII…
byte (8 bit) hoặc 1 word (16 bit). ƒ Tất cả bit được sử dụng để biểu diễn giá trị.
ƒ Biểu diễn số nguyên không dấu, số nguyên có ƒ Số nguyên không dấu 1 byte lớn nhất là
dấu, số thực và ký tự. 1111 11112 = 28 – 1 = 25510.
™Hai loại bit đặc biệt ƒ Số nguyên không dấu 1 word lớn nhất là
ƒ msb (most significant bit): bit nặng nhất (bit n) 1111 1111 1111 11112 = 216 – 1 = 6553510.
ƒ lsb (least significant bit): bit nhẹ nhất (bit 0) ƒ Tùy nhu cầu có thể sử dụng số 2, 3… word.
ƒ lsb = 1 thì số đó là số đó là số lẻ.
NMLT - Các kỹ thuật thao tác trên bit 5 NMLT - Các kỹ thuật thao tác trên bit 6

&& &&
VC
VC
BB
BB
Biểu diễn số nguyên có dấu VC
VC
BB
BB
Số bù 1 và số bù 2

™Đặc điểm
Số 5 (byte) 0 0 0 0 0 1 0 1
ƒ Lưu các số dương hoặc âm.
Số bù 1 của 5 1 1 1 1 1 0 1 0
ƒ Bit msb dùng để biểu diễn dấu
• msb = 0 biểu diễn số dương. VD: 0101 0011 + 1
• msb = 1 biểu diễn số âm. VD: 1101 0011
Số bù 2 của 5 1 1 1 1 1 0 1 1
ƒ Trong máy tính, số âm được biểu diễn ở dạng
số bù 2. + Số 5 0 0 0 0 0 1 0 1

Kết quả 1 0 0 0 0 0 0 0 0

NMLT - Các kỹ thuật thao tác trên bit 7 NMLT - Các kỹ thuật thao tác trên bit 8
&& &&
VC
VC
BB
BB
Biểu diễn số nguyên có dấu VC
VC
BB
BB
Tính giá trị có dấu và không dấu

™Nhận xét ™Tính giá trị không dấu và có dấu của 1 số?
ƒ Số bù 2 của x cộng với x là một dãy toàn bit 0 ƒ Ví dụ số word (16 bit): 1100 1100 1111 0000
(không tính bit 1 cao nhất do vượt quá phạm ƒ Số nguyên không dấu ?
vi lưu trữ). Do đó số bù 2 của x chính là giá trị • Tất cả 16 bit lưu giá trị.
âm của x hay – x. => giá trị là 52464.
ƒ Đổi số thập phân âm –5 sang nhị phân? ƒ Số nguyên có dấu ?
Î Đổi 5 sang nhị phân rồi lấy số bù 2 của nó. • Bit msb = 1 do đó số này là số âm.
ƒ Thực hiện phép toán a – b? => độ lớn là giá trị của số bù 2.
Îa – b = a + (–b) => Cộng với số bù 2 của b. • Số bù 2 = 0011 0011 0001 0000 = 13072.
=> giá trị là –13072.
NMLT - Các kỹ thuật thao tác trên bit 9 NMLT - Các kỹ thuật thao tác trên bit 10

&& &&
VC
VC
BB
BB
Tính giá trị có dấu và không dấu VC
VC
BB
BB
Tính giá trị có dấu và không dấu

™Bảng giá trị số không dấu/có dấu (byte & word) ™Nhận xét
HEX Không dấu Có dấu HEX Không dấu Có dấu ƒ msb=0 Î giá trị có dấu bằng giá trị không dấu.
00 0 0 0000 0 0 ƒ msb=1 Î thì giá trị có dấu bằng giá trị không
01 1 1 0001 1 1
dấu trừ 28=256 (byte) hay 216=65536 (word).
msb = 0

02 2 2 0002 2 2
… … … … … …
… … … … … … ™Tính giá trị không dấu và có dấu của 1 số?
7E 126 126 7FFE 32766 32766
7F 127 127 7FFF 32767 32767 ƒ Ví dụ số word (16 bit): 1100 1100 1111 0000
80 128 –128 8000 32768 –32768 ƒ Giá trị không dấu là 52464.
81 129 –127 8001 32769 –32767
msb = 1

… … … … … … ƒ Giá trị có dấu: vì bit msb = 1 nên giá trị có dấu


… … … … … …
FE 254 –2 FFFE 65534 –2
bằng 52464 – 65536 = –13072.
FF 255 –1 FFFF 65535 –1
NMLT - Các kỹ thuật thao tác trên bit 11 NMLT - Các kỹ thuật thao tác trên bit 12
&& &&
VC
VC
BB
BB
Các toán tử trên bit VC
VC
BB
BB
Các toán tử trên bit

™Toán tử & (and) ™Toán tử | (or)


& 0 1 | 0 1
0 0 0 0 0 1
1 0 1 1 1 1
™Ví dụ ™Ví dụ
ƒ int x = 2912, y = 1706, z = x & y; ƒ int x = 2912, y = 1706, z = x | y;
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0
& |
0 0 0 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 1 0

544 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 4074 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0
NMLT - Các kỹ thuật thao tác trên bit 13 NMLT - Các kỹ thuật thao tác trên bit 14

&& &&
VC
VC
BB
BB
Các toán tử trên bit VC
VC
BB
BB
Các toán tử trên bit

™Toán tử ^ (xor) ™Toán tử ~ (not)


^ 0 1
~ 0 1
0 0 1
1 0
1 1 0
™Ví dụ ™Ví dụ
ƒ int x = 2912, y = 1706, z = x ^ y; ƒ int x = 2912, z = ~x;
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 ~ 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0
^
0 0 0 0 0 1 1 0 1 0 1 0 1 0 1 0
-2913 1 1 1 1 0 1 0 0 1 0 0 1 1 1 1 1
3530 0 0 0 0 1 1 0 1 1 1 0 0 1 0 1 0
NMLT - Các kỹ thuật thao tác trên bit 15 NMLT - Các kỹ thuật thao tác trên bit 16
&& &&
VC
VC
BB
BB
Các toán tử trên bit VC
VC
BB
BB
Các toán tử trên bit

™Toán tử << n (shift left) ™Toán tử >> n (shift right)


ƒ Dịch các bit sang trái n vị trí. ƒ Dịch các bit sang phải n vị trí.
ƒ Các bit vượt quá phạm vi lưu trữ sẽ mất. ƒ Các bit vượt quá phạm vi lưu trữ sẽ mất.
ƒ Tự động thêm bit 0 vào cuối dãy bit. ƒ Giữ lại bit nặng nhất (msb) Ù dấu của số
™Ví dụ ™Ví dụ
ƒ int x = 2912, z = x << 2; ƒ int x = 2912, z = x >> 2;
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

11648
5824 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 1456
728 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0

msb 0
NMLT - Các kỹ thuật thao tác trên bit 17 NMLT - Các kỹ thuật thao tác trên bit 18

&& &&
VC
VC
BB
BB
Các toán tử trên bit VC
VC
BB
BB
Ứng dụng trên số nguyên

™Lưu ý ™Ứng dụng của các toán tử &, |, ^, ~


ƒ Không được nhầm lần các các toán tử trên bit a. Bật bit thứ i của biến n (onbit)
(&, |, ~) với các toán tử kết hợp (&&, || , !) b. Tắt bit thứ i của biến n (offbit)
ƒ Các toán tử gộp: &= |= ^= <<= >>= c. Lấy giá trị của bit thứ i của biến n (getbit)
ƒ Máy tính làm việc trên bit nên các thao tác d. Gán giá trị 0 cho biến n (setzero)
trên hệ nhị phân sẽ nhanh hơn rất nhiều so ™Ứng dụng của các toán tử dịch bit << và >>
với hệ khác.
e. Nhân n với 2i (mul2pow)
ƒ Phải luôn nhớ độ dài của dãy bit đang làm
việc (8bit, 16bit, 32bit, 64bit, …) f. Chia n với 2i (div2pow)

NMLT - Các kỹ thuật thao tác trên bit 19 NMLT - Các kỹ thuật thao tác trên bit 20
&& &&
VC
VC
BB
BB
Bật bit thứ i của biến n VC
VC
BB
BB
Tắt bit thứ i của biến n
i=9 ni | 0 = ni i=9 ni & 1 = ni
ni | 1 = 1 ni & 0 = 0

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

n n15 n14 n13 n12 n11 n10 n9 n8 n7 n6 n5 n4 n3 n2 n1 n0 n n15 n14 n13 n12 n11 n10 n9 n8 n7 n6 n5 n4 n3 n2 n1 n0

| 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 & 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1

n15 n14 n13 n12 n11 n10 1 n8 n7 n6 n5 n4 n3 n2 n1 n0 n15 n14 n13 n12 n11 n10 0 n8 n7 n6 n5 n4 n3 n2 n1 n0

void onbit(int &n, int i) void offbit(int &n, int i)


{ {
n = n | (0x1 << i); n = n & (~(0x1 << i));
} }

NMLT - Các kỹ thuật thao tác trên bit 21 NMLT - Các kỹ thuật thao tác trên bit 22

&& &&
VC
VC
BB
BB
Lấy giá trị bit thứ i của biến n VC
VC
BB
BB
Gán giá trị 0 cho biến n
i=9
ni ^ ni = 0

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

n n015 n014 n013 n012 n011 n010 n09 n08 n07 n6 n5 n4 n3 n2 n1 n0 n n15 n14 n13 n12 n11 n10 n9 n8 n7 n6 n5 n4 n3 n2 n1 n0

& 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ^ n15 n14 n13 n12 n11 n10 n9 n8 n7 n6 n5 n4 n3 n2 n1 n0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 n9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

int getbit(int n, int i) void setzero(int &n)


{ {
return (n >> i) & 0x1; n = n ^ n;
} }

NMLT - Các kỹ thuật thao tác trên bit 23 NMLT - Các kỹ thuật thao tác trên bit 24
&& &&
VC
VC
BB
BB
Nhân n với 2i VC
VC
BB
BB
Chia n với 2i

™Đặc điểm toán tử << ™Đặc điểm toán tử >>


ƒ n = ∑(nj2j) với j ∈ [0, k] (k là chỉ số bit msb) ƒ n = ∑(nj2j) với j ∈ [0, k] (k là chỉ số bit msb)
ƒ Dịch trái i bit Î số mũ mỗi ký số tăng thêm i ƒ Dịch phải i bit Î số mũ mỗi ký số giảm đi i
ƒ Î n << i = ∑(nj2j+i) = 2i∑(nj2j) = 2in ƒ Î n << i = ∑(nj2j–i) = 2–i∑(nj2j) = 2–in = n/2i
ƒ Vậy, dịch trái i bit Ù nhân với 2i ƒ Vậy, dịch phải i bit Ù chia cho 2i

int mul2powi(int n, int i) int div2powi(int n, int i)


{ {
return n << i; return n >> i;
} }

NMLT - Các kỹ thuật thao tác trên bit 25 NMLT - Các kỹ thuật thao tác trên bit 26

&& &&
VC
VC
BB
BB
Bài tập thực hành VC
VC
BB
BB
Bài tập thực hành

™Bài 1: Viết hàm thực hiện các thao tác trên bit. ™Bài 5: Viết hàm RotateLeft(n, i) thực hiện thao
™Bài 2: Viết bitcount đếm số lượng bit 1 của một tác “xoay” các bit của n (kô dấu) sang trái i vị trí
số nguyên dương n. và các bit bị mất sẽ được đưa vào cuối dãy bit.
™Bài 3: Cho mảng a gồm n số nguyên khác nhau. Ví dụ
Viết hàm liệt kê các tổ hợp 1, 2, …, n phần tử ƒ int n = 291282; n = RotateLeft(n, 2);
của số nguyên đó (không cần theo thứ tự) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Ví dụ, n = 3, mảng a = {1, 2, 3} ??? 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 0


Î{1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3} ™Bài 6: Tương tự bài 2 nhưng viết hàm
™Bài 4: Giống bài 3 nhưng chỉ liệt kê các tổ hợp k RotateRight(n, i) để xoay bit sang phải.
phần tử (1 ≤ k ≤ n)
NMLT - Các kỹ thuật thao tác trên bit 27 NMLT - Các kỹ thuật thao tác trên bit 28
&&
VC
VC
BB
BB
Bài 3 (gợi ý)

a b c
0 0 0 0 { }
1 0 0 1 { c }
2 0 1 0 { b }
3 0 1 1 { b c }
4 1 0 0 { a }
5 1 0 1 { a c }
6 1 1 0 { a b }
7 1 1 1 { a b c }
NMLT - Các kỹ thuật thao tác trên bit 29

You might also like