CÁC KIẾN THỨC CƠ BẢN VỀ BIT TRẠNG THÁI Error: Reference source not found 1.. Là giáo viên dạy tin nhiều năm tôi thấy việc trang bị cho các em học sinhcác kiến thức về thuật toán và giải
Trang 1Kỹ thuật dùng bit trạng thái để xử lý hiệu quả bài toán Tin học
MỤC LỤC
A ĐẶT VẤN ĐỀ Error: Reference source not found
I LÝ DO CHỌN ĐỀ TÀI Error: Reference source not found
II CƠ SỞ LÝ LUẬN Error: Reference source not foundIII CƠ SỞ THỰC TIỄN Error: Reference source not found
1 Thuận lợi: Error: Reference source not found
2 Khó khăn: Error: Reference source not found
IV NỘI DUNG Error: Reference source not found
V PHẠM VI ỨNG DỤNG CỦA ĐỀ TÀI Error: Reference source not found
B NỘI DUNG Error: Reference source not found
I CÁC KIẾN THỨC CƠ BẢN VỀ BIT TRẠNG THÁI Error: Reference source not found
1 Phép đảo bit Not Error: Reference source not found
2 Phép AND Error: Reference source not found
3 Phép OR Error: Reference source not found
4 Phép phủ định NOT Error: Reference source not found
5 Phép XOR Error: Reference source not found
6 Phép dịch trái << Error: Reference source not found
7 Phép dịch phải >> Error: Reference source not found
II CÁC BÀI TOÁN MINH HỌA VỀ XỬ LÝ BIT TRẠNG THÁI Error: Reference source not found
Bài toán 1 Error: Reference source not foundBài toán 2 Error: Reference source not foundBài toán 3: Error: Reference source not foundBài toán 4: Phép cộng Error: Reference source not foundBài toán 5 Tập con Error: Reference source not foundBài toán 6: Trò chơi NIM Error: Reference source not foundBài toán 7 Số khác Error: Reference source not foundBài toán 8 Xâu cô lập Error: Reference source not foundBài toán 9 FIRSTROW Error: Reference source not found
Trang 2Bài toán 10 Dãy số Error: Reference source not foundBài toán 11: Đầu bếp Error: Reference source not foundBài toán 12: Biểu diễn trạng thái Error: Reference source not foundBài toán 13: Quy hoạch động Error: Reference source not foundBài toán 14: Chọn ô Error: Reference source not foundBài toán 15: Chuyến du lịch - TRIP Error: Reference source not found Bài toán 16: Cô gái chăn bò - COWGIRL Error: Reference source not found
C KẾT LUẬN Error: Reference source not found
Trang 3A ĐẶT VẤN ĐỀ
I LÝ DO CHỌN ĐỀ TÀI
Trong thời đại hiện nay công nghệ thông tin đã thực sự bùng nổ và đã có tácđộng rất lớn đến với công cuộc phát triển kinh tế - xã hội của con người, của đấtnước (và thực tế ta có thể nói rằng ta đang sống trong kỉ nguyên số, kỉ nguyêncông nghệ thông tin) Đảng và nhà nước ta đã xác định rõ là để đất nước phát triểnthì một trong những yếu tố làm nền tảng là làm sao các ứng dụng của Tin học –công nghệ thông tin phải đưa vào triệt để trong các lĩnh vực của xã hội
Những yêu cầu đẩy mạnh của các ứng dụng công nghệ thông tin, đào tạonguồn nhân lực đáp ứng yêu cầu Công nghiệp hóa, Hiện đại hóa, mở cửa và hộinhập, hướng đến nền kinh tế tri thức của đất nước ta nói riêng, thế giới nói chung
Chính vì xác định được tầm quan trọng đó, tôi nghĩ đào tạo và cung cấp chođất nước những nhà lập trình viên giỏi là việc làm hết sức cần thiết
Tin học lập trình là một môn học khó đối với học sinh THPT Làm thế nào
để học sinh hiểu, học tốt, yêu thích và tham gia tốt các kỳ thi học sinh giỏi Tin học
là điều mà nhiều giáo viên dạy tin học trăn trở
Là giáo viên dạy tin nhiều năm tôi thấy việc trang bị cho các em học sinhcác kiến thức về thuật toán và giải quyết vấn đề một cách khoa học là rất cần thiết,điều đó giúp học sinh hứng thú hơn trong học tập bởi các em tự kiến tạo tri thứchoặc tham gia vào việc kiến tạo tri thức cho mình dựa trên tri thức đã có, bổ sung
và làm cho tri thức cũ hoàn chỉnh hơn Học sinh học tập tự giác, tích cực, vừa kiếntạo tri thức, vừa học đựơc cách giải quyết vấn đề, lại vừa rèn luyện được nhữngđức tính quý báu như tính chủ động, tích cực, tính kiên trì vượt khó, tính kế hoạch
và thói quen tự kiểm tra…
Trong đề tài này, tôi xin được đề cập tới “Kỹ thuật dùng bit trạng thái để
xử lý hiệu quả bài toán tin học”.
Như chúng ta đã biết, bộ nhớ của máy tính được lưu trữ dưới dạng mã hóacủa hệ nhị phân theo bảng mã IISCI Bản chất máy tính chỉ hiểu được mã nhị phândưới dạng dãy số 0 và 1 Mỗi con số như vậy được gọi là một bit Bít là đơn vị nhỏnhất để lưu trữ dữ liệu trong máy tính điện tử, mỗi bit chứa số 0 hoặc 1 Chính vìvậy khi lập trình nếu ta chuyển bài toán về xử lý dưới dạng bit thì tốc độ củachương trình được đẩy nhanh rất nhiều
Trang 4Ngôn ngữ lập trình cung cấp cho chúng ta những toán tử để chúng ta có thểthao tác trên bit như các phép cơ bản and, or, not, xor, dịch trái, dịch phải Trong đềtài này tôi sẽ cung cấp kiến thức về việc sử dụng các phép toán logic từ đó giúpcho việc thiết kế các biểu thức logic dùng rất nhiêu trong các phép toán điều kiệnđược nhanh chóng, chính xác, hiệu quả Hơn nữa trong đề tài này sẽ phân tích sựhiệu quả của việc chuyển bài toán từ phương pháp xử lý thông thường sangphương pháp xử lý bit.
II CƠ SỞ LÝ LUẬN
Qua nhiều năm giảng dạy, bồi dưỡng học sinh giỏi môn Tin học tôi nhậnthấy:
- Việc trang bị cho các em học sinh các kiến thức về thuật toán và giải quyếtvấn đề một cách khoa học là rất cần thiết
- Phương pháp dùng kỹ thuật bit trạng thái để xử lý thực sự hiệu quả bài toántin học
- Trong tất cả các kỳ thi chọn học sinh giỏi Tỉnh, các bài toán dùng phươngpháp bit trạng thái thực sự rất hiệu quả
III CƠ SỞ THỰC TIỄN
Một số thuận lợi và khó khăn khi thực hiện chuyên đề sáng kiến kinhnghiệm ở trường
- Học sinh rất hứng thú đối với môn học này
- Môn học có ứng dụng rất lớn trong thực tiễn nên học sinh rất chịu khónghiên cứu học tập
- Hàng năm kết quả thi học sinh giỏi môn Tin đạt kết quả cao nên tạo độnglực lớn cho học sinh quyết tâm học tập
2 Khó khăn:
Trang 5- Các tài liệu bồi dưỡng học sinh giỏi môn tin còn rất ít.
- Giáo viên đủ chuẩn để bồi dưỡng học sinh giỏi môn tin còn hạn chế
- Là môn học khó, đòi hỏi người học hội tụ quá nhiều phẩm chất như: Thôngminh, tư duy tốt, kiên trì, có năng khiếu về lập trình, cẩn thận, nhanh nhạnh nhưngchính xác tuyệt đối trong từng kỹ thuật nhỏ
IV NỘI DUNG
- Các kiến thức cơ bản về bit trạng thái
- Các bài toán minh họa ứng dụng xử lý bit
V PHẠM VI ỨNG DỤNG CỦA ĐỀ TÀI
Nội dung của đề tài được sử dụng làm tài liệu cho các học sinh ở các trườngTHCS, THPT yêu thích môn tin học lập trình Đề tài cũng là tài liệu cho các đồngnghiệp trong và ngoài Tỉnh yêu thích bộ môn Tin học
Trang 6B NỘI DUNG
I CÁC KIẾN THỨC CƠ BẢN VỀ BIT TRẠNG THÁI
Quy ươc về vị trí của các bit: Mỗi byte bao gồm 8 bit được mã số từ phảisang trái còn gọi là bit thấp đến bit cao Bit nằm ở bên phải được xem là thấp hơnbit nằm ở bên trái Các bit được đánh số như sau: 7 6 5 4 3 2 1 0
Mỗi bit có thể nhận 1 trong 2 giá trị là 0 hoặc 1 Tại mỗi thời điểm thực hiệnchương trình mỗi bit đươc nhận giá trị xác định Mọi số nguyên trong máy đềubiểu diễn dưới dạng nhị phân, ví dụ số 19 được biểu diễn như sau: Bit 7 6 5 4 3 2 10
1 Phép đảo bit Not
Đổi giá trị của mọi bit từ 0 thành 1 và ngược lại
Trong C phép đảo được kí hiệu là ~
Ví dụ
Các toán thử thao tác trên bit (bitwise)
Dữ liệu lưu trữ trong máy tính dưới dạng nhị phân 0 1,
ví dụ:
unsigned char a = 12;
Thì lưu trữ dưới bộ nhớ là: 0000 1100Tương tự
unsigned int b = 95;
Lưu trữ b dưới bộ nhớ là: 0000 0000 0000 0000 0000 0000 0101 1111Không gian lưu trữ kiểu unsigned int lớn hơn unsigned char do unsignedint dùng 32 bits để biểu diễn còn unsigned char dùng 8 bits để biểu diễn
Các toán tử thao tác trên bit
Trang 7Phép thao tác trên bit Kí hiệu
Trang 81 1 1Phép OR chỉ có giá trị 0 nếu cả hai toán hạng đều có giá trị 0.
Trang 9B = A >> 2 0000 0011
Các ví dụ thao tác cơ bản trên bit
AND
unsigned char a = 5; // 00000101(5)unsigned char b = 6; // 00000110(6)unsigned char c = a & b; // 00000100(4)OR
unsigned char a = 5; // 00000101(5)unsigned char b = 6; // 00000110(6)unsigned char c = a | b; // 00000111(7)NOT
Trang 10unsigned char a = 5; // 00000101(5)unsigned char b = a >> 1; // 00000010(2)
II CÁC BÀI TOÁN MINH HỌA VỀ XỬ LÝ BIT TRẠNG THÁI
Bài toán 1: Lấy bit
Ứng dụng 1 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
Trang 11Gọ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áibit 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ênsizeof(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
char Getnum(char x, j, i)
{
char k;
k= (sizeof(x) Shl 3)-1-jreturn x Shl k Shr k Shr i;
- 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)Thủ tục Batbit(x,i) gán trị 1 cho bit thứ i trong byte x
Mô tả: Ta chuyển 1 đến vị trí i tương ứng sau đó thực hiện phép cộng logicvới byte x
Ví dụ này chỉ mang tính minh họa
char Batbit(char x, i)
{
return x OR(1 Shl i);
}
Thu tục Tatbit(x, i) gán trị 0 cho bit thứ i trong byte
Mô tả: Ta chuyển 1 đến vị trí i tương ứng, sau đó đảo byte này để được byte
có 0 ở vị trí i và 1 ở các bit còn lại, cuối cùng thực hiện phép nhân logic với byte x
Trang 12Ví dụ này chỉ mang tính minh họa
Thao tác bit: bit 0 được coi như là false (sai); bit 1 được coi như là true(đúng) Các toán tử là '~' (NOT), '&' (AND), '|' (OR) va` '^' (XOR)
Về phép dịch bit: các toán tử là '>>' (dịch qua phải) và '<<' (dịch qua trái)(tương ứng với phép dịch cho số không dấu trong hợp ngữ; C không có toán tửdịch qua phải có dấu)
Phép nhân Ai Cập cổ đại chỉ ra cách để có thể nhân hai số nguyên tùy thích a
và b (trong đó a lớn hơn b) mà chỉ cần sử dụng thao tác dịch chuyển bit và phép cộng:
Trang 13Một ví dụ nữa là mã giải của phép cộng, chỉ ra cách để tính tổng của hai số nguyên a và b sử dụng các toán tử thao tác bit và phép thử số 0:
Bài toán 5 Tập con
Duyệt qua tất cả các tập con có k phần tử
int s = (1 << k) - 1;
while (!(s & 1 << N))
{
//làm gì đó với sint lo = s & ~(s - 1); //bit 1 thấp nhấtint lz = (s + lo) & ~s; //bit 0 thấp nhất trên lo
s |= lz; //thêm lz vào tập hợp
s &= ~(lz - 1); //reset bit phía dưới lz
s |= (lz / lo / 2) - 1; //đặt lại đúng số bit ở cuối}
Trong C, dòng cuối có thể viết là s |= (lz >> ffs(lo)) - 1 để tránh phép chia.Xác định x ? y : -y, trong đó x bằng 0 hoặc 1 (-x ^ y) + x
Bài toán 6: Trò chơi NIM
Có n đống sỏi, mỗi đống có một số viên sỏi Hai người chơi luân phiên nhau
đi như sau Đến lượt người nào, người đó tùy chọn một đống sỏi để bốc số viên sỏi
Trang 14trong đống đã chọn và buộc phải bốc, ít nhất là 1 viên, nhiều nhất là cả đống Aibốc được những viên sỏi cuối cùng sẽ thắng Lập chương trình tổ chức chơi giữamáy tính và người theo các yêu cầu sau:
- Số lượng sỏi lúc đầu được quy định trước
- Số lượng sỏi trong mỗi đống được sinh ngẫu nhiên
- Máy sẽ gieo xu để xác định máy hoặc người đi trước
- Có thông báo kết quả mỗi ván
Nếu thế thắng chung cuộc có tính chất T thì ai gặp phải thế đó sẽ thua, do đó
ta phải tìm mọi cách "nhường" thế có tính chất T cho đối phương.Tính chất T nói trên được gọi là bất biến của trò chơi Khi chung cuộc mọiđống sỏi đều hết cho nên S=0
Giả sử ta có n đống sỏi Gọi ai là số sỏi trong đống thứ i; i=1 n Ta lấy tổngloại trừ của các ai
S= a1 XOR a2 XOR XOR an
Ta sẽ chứng minh rằng bất biến (tính chất T) của trò chơi NIM chính là S=0
Ta sẽ sử dụng một số tính chất sau đây của phép XOR:
Tính chất 1: a XOR b =0 khi và chỉ khi a=b (suy từ định nghĩa)
Tính chất 2: a XOR b = b XOR a (tính giao hoán)
Tính chất 3: (a XOR b) XOR c = a XOR (b XOR c) (Tính kết hợp)
Tính chất 4: a XOR 0= a
Ta thừa nhận định lý sau:
Định lý: Nếu S<>0 thì tồn tại một ai thỏa mãn ai XOR S < ai
a2= 8= B1000
a3= 3= B0011
S= 2= B0010
Trang 15Ta có a1 XOR S= 11>9 =a1
a2 XOR S= 10>8 = a2
a3 XOR S= 1< a3
Vậy a3 chính là số tìm được theo định lý trên
Nhận xét: Nếu S=0 và có ít nhất một đống sỏi với số sỏi khác 0 thì với mọicách đi ta luôn luôn có tổng loai trừ của các đống sỏi là một số khác 0
Thật vậy, không làm mất tính tổng quát ta giải sử rằng đống sỏi được chọn
để bốc là a1 Giả sử rằng sau khi bốc đống a1 ta còn lại b1 viên sỏi Có thế coi việcbốc sỏi là thay đống a1 bằng b1, vì a1 XOR a1= 0 nên tổng loài trừ thu được sau khibốc sẽ là:
P= b1 XOR (a2 XOR XOR an)
Nếu P = 0 thì b1=(a2 Xor Xor an)=0 XOR (a2 Xor Xor an)= (a1 Xor a1) Xor(a2 Xor Xor an)= = a1 Xor (a1 Xor a2 Xor Xor an)= a1 Xor S
Vì S =0 nên b1 = a1 XOR 0= a1
chơi Vậy sau khi bốc ta phải có P<>0
Hệ quả: Gọi S và P lần lượt là tổng loại trừ của các đống sỏi trước và saumột bước đi Ta có, nếu S<>0 thì có một cách đi để P= 0;
Thật vậy, theo định lý trên ta tìm được một số ai để (ai XOR S)< ai
Đặt bi = ai- (ai XOR S) Ta bốc bi viên sỏi từ đống ai, đống này sẽ còn (ai
XOR S) viên
Từ nhận xét và hệ quả nói trên ta suy ra S=0 chính là bất biến của trò chơiNIM
Nước đi của đối thủ thông minh khi đó sẽ bao gồm hai bước sau:
Bước 1: Tính S= a1 XOR a2 XOR a3 XOR an
Bước 2: Nếu S <> 0: thực hiện các bước sau:
Bước 2a Duyệt các đống sỏi để tìm đống ai thỏa điều kiện (ai XOR S)< ai
Bước 2b Bốc ai - (ai XOR S) viên từ đống ai tìm được Số sỏi còn lại củađống này sẽ là (ai XOR S)
Trang 16Nếu S=0: chọn đống lớn để bốc 1 viên cốt làm cho đối phương khó pháthiện nguy cơ thua của ta.
Như vậy thủ tục NIM - Trò chơi NIM với m đống sỏi gồm các bước sauBước 1: Kiểm tra giá trị hợp lệ của m
Bước 2: Khởi trị;
Bước 2a Sinh ngẫu nhiên các giá trị ai>=1, i=1 n
Bước 2b Gieo xu để xác định ai đi trước, người hay máy
Bước 3 Chơi theo sơ đồ sau
Bước 4: Thông báo kết quả thắng- thua giữa người và máy
Trong đó thủ tục Maydi được triển khai theo sơ đồ đối thủ thông minh trìnhbày ở trên
Trò chơi này nhìn chung đơn giản, dễ dàng cài đặt, nếu có thêm chút đồ họavào là quá ngon lành Chúc các bạn thấy vui vẻ với trò chơi này
Bài toán 7 Số khác
Xét một dãy gồm N số nguyên A1, A2, A3,…,AN-1, AN Dãy có tính chất sau:Tất cả các số đều xuất hiện một số chẵn lần
Có duy nhất một số x xuất hiện đúng một lần gọi là số khác.
Yêu cầu: Hãy tìm số khác của một dãy cho trước.
Dữ liệu vào: Trong file văn bản SK.INP gồm:
Dòng đầu là số N (N≤107)
N dòng tiếp theo, dòng thứ i là số Ai có giá trị tuyệt đối không quá 109
Ví dụ:
SK.INP SK.OUT
Trang 17}cout<<kq;
}
Phép toán xor là phép toán triệt tiêu bit: 2 bit giống nhau cho giá trị 0; 2 bítkhác nhau cho giá trị 1
Ta xét dãy n=5 số: 1, 3, 7, 3, 1
Trang 18Lần 1: m=0 (tức là 00 trong hệ nhị phân); x= 1( = 01 trong hệ nhị phân)
Bài toán 8 Xâu cô lập
Cho trước N (N≤10000) xâu kí tự độ dài không quá 255 kí tự Xâu cô lậpđược định nghĩa là xâu chỉ xuất hiện duy nhất 1 lần trong N xâu đã cho Các xâucòn lại luôn xuất hiện một số chẵn lần
Yêu cầu: Tìm xâu cô lập từ N xâu đã cho Với dữ liệu vào là hoàn toàn đúng
đắn
Dữ liệu vào: Trong file văn bản SINGLE.INP gồm N dòng biểu diễn N xâu
đã cho ban đầu
Kết quả ra: Ra file văn bản SINGLE.OUT xâu cô lập
Ví dụ: