BM MMT-VT – Khoa CNTT – ĐH KHTN
KTMT & HN
KIẾ KIẾN TRÚC MÁY TÍNH VÀ HỢ HỢ P NGỮ NGỮ Bài tậ p: Khảo sát số nguyên Biên soạn: Lê Viết Long
Quy định: định: 1. Thờ i gian làm bài: 2 tu ần 2. Làm nhóm: 2sv/nhóm 3.
Thư mục bài nộ p là MSSV1_MSSV2 có ch ứa các thư mục sau: -
Source: chứa source code chương trình
-
Report: chứa báo cáo
4. Các bài chép source l ẫn nhau 0 điểm thực hành 5.
Deadline: 23/10/2013
Yêu cầ cầu: 1. Thiết k ế kiểu dữ liệu mớ i cho phép bi ểu diễn các số nguyên l ớn hơn vượ t quá phạm vi 4 byte. (1 đ) 2. Xây dựng các Operator cho ki ểu dữ liệu trên (8 đ) a. Phép cộng “+” b. Phép tr ừ “-” c. Phép nhân “*” d.
Phép chia “/”
e. Phép dịch phải “>>” f. Phép dịch trái “<<” g. BinToDec (chuyển đổi dãy bit sang s ố nguyên) h. DecToBin (chuyển đổi số nguyên sang dãy bit) 3. Viết chương trình cho phép thự c hiện các chức năng như trên. (2đ)
-1-
BM MMT-VT – Khoa CNTT – ĐH KHTN
KTMT & HN
Gợ i ý: 1. Biểu diễn Số nguyên lớ n -
Để biểu diễn số nguyên lớn hơn phạ m vi 4byte có nhi ều cách. Trong hướ ng dẫn này sẽ gợ i ý cách biểu diễn trong ph ạm vi 8 byte không d ấu. Từ đó sinh viên có thể phát triển để biểu diễn các số nguyên có d ấu, trong ph ạm vi l ớn hơn tùy ý.
-
Một cách thông thường và
đơn giản để biểu diễn số nguyên 8byte không d ấu. Sử
dụng cấu trúc sau: typedef struct BigInt { char bit[64]; }
-
Cấu trúc trên s ử dụng mảng 1 chi ều kiểu char gồm 64 phần tử để lưu 64 bit của số nguyên 8 byte.
-
Vớ i cách này việc xử lý tính toán khá
đơn giản do việc truy xuất dãy bit trên
mảng 1 chi ều khá d ễ dàng. -
Tuy nhiên, cách bi ểu diễn này có h ạn chế về mặt lưu trữ : sử dụng mảng char 64 phần tử để biểu diễn 64bit c ủa số nguyên dùng 64 byte để biểu diễn 8 byte lãng phí vùng nh ớ .
-
Để khắc phục vấn đề lãng phí vùng nh ớ , ta có th ể khai báo c ấu trúc ki ểu dữ liệu mới như sau: typedef struct BigInt { Int data[4]; }
-
Kiểu d ữ li ệu trên s ử d ụng
64 bit tương ứ ng v ớ i m ảng 2 int để bi ểu di ễn 64 bit
của số nguyên 8 byte. -
Vậy làm sao để biểu diễn số nguyên 8 byte thành ki ểu dữ liệu BigInt. Ta c ần giải quyết lần lượ t các vấn đề sau: -2-
BM MMT-VT – Khoa CNTT – ĐH KHTN +
KTMT & HN
Do số nguyên lớn hơn 4 byte nên không thể dùng lệnh scanf (“%d”,…) để đọc giá tr ị vừa nhậ p chỉ có thể đọc dãy số vừa nhậ p bằng cách đọc theo chuỗi.
+
Làm sao để chuyển đổi dãy số ở dạng chuỗi v ề kiểu BigInt? Ta có th ể giải quyết b ằng thu ật
toán đã họ c (Tính các bit b ằng cách đem dãy số chia 2 và
lấy phần dư), ta có hàm
để chuyển đổi chuỗi số sang BigInt như sau:
void StrToBigInt(string X, BigInt &a) { int i = 63; // bắt đầu set bit t ại while (X ! = "0") { int bit = (X[X.length()-1] SetBit(a,i,bit); // Tạo bit X=StrDiv2(X); // Chia chu ỗi i--;
vị trí cu ối cùng
ần dư - 48) % 2; // Tính ph (biến bit) tại vị trí bit i c ủa biến a số X cho 2
} }
-
Hàm tạo giá tr ị bit t ại vị trí bit i c ủa Kiểu dữ liệu BigInt
void SetBit(BigInt &a, int i, int bit) { ần tử // Tùy theo v ị trí i ta quy ết định thao tác x ử lý bit trên ph nào của // biến BigInt. // VD: i = 31 thao tác bit th ứ 31 của a.data[0], // i = 32 thao tác bit th ứ 1 của a.data[1] }
-
Hàm chia một dãy số nguyên dạng chuỗi cho 2
string StrDiv2(string X) { //Sinh viên t ự viết }
-
Để xem đượ c giá tr ị của biến BigInt, ta xây d ựng hàm xuất giá tr ị biến BigInt ra màn hình như sau:
-3-
BM MMT-VT – Khoa CNTT – ĐH KHTN
KTMT & HN
void PrintBigInt(BigInt a) { // Truy xu ất dãy bit c ủa a và đổ i nó sang th ập phân (ở dạng chuỗi) theo thu ật toán // đã học: 63− // ∑ 63 =0 ∗ 2 // Trong đó: S là số thập phân của dãy bit, là bit th ứ i của kiểu dữ liệu // BigInt. //Print dãy s ố thâp phân ( ở dạng chuỗi) tìm đượ c ra màn hình. }
2. Các thao tác trên số nguyên lớ n -
Cac hàm tính toán đượ c viết theo phương thức Operator như sau: a. Hàm tổng 2 số BigInt
Bigint operator + (BigtInt a, Bigint b) { //... }
b. Hàm hiệu 2 số BigInt Bigint operator - (BigtInt a, Bigint b) { //... }
c. Hàm thương 2 số BigInt Bigint operator / (BigtInt a, Bigint b) { //... }
d. Hàm tích 2 số BigInt Bigint operator * (BigtInt a, Bigint b) { //... }
-4-
BM MMT-VT – Khoa CNTT – ĐH KHTN
e. Hàm and Bigint operator & (BigtInt a, BigtInt b) { //... }
f. Hàm or Bigint operator | (BigtInt a, BigtInt b) { //... }
g. Hàm xor Bigint operator ^ (BigtInt a, BigtInt b) { //... }
h. Hàm not Bigint operator ~ (BigtInt a, BigtInt b) { //... }
i. Hàm dịch phải Bigint operator >> (BigtInt x, int i) { //... }
j. Hàm dịch trái
Bigint operator << (BigtInt x, int i) { //... }
-5-
KTMT & HN
BM MMT-VT – Khoa CNTT – ĐH KHTN
KTMT & HN
3. Viết chương trình minh họa: -
Sinh viên vi ết chương trình cho phép nhậ p 2 số BigInt và th ể hiện menu tính toán
như sau, nhậ p giá tr ị của menu để thực hiện việc tính toán tương ứ ng: Nhap BigInt a: Nhap BigInt b: ---------------------------------Menu------------------------1. Xuat a va b 2. Xem day bit a va b 3. Tong a va b 4. Hieu a va b 5. Thuong a va b 6. Tich a va b 8. Phép and a va b 9. Phép or a va b 10. Phép xor a va b 11. Phép not a va b 12. Dich trai a 13. Dich phai b --------------------------------------------------------------. Chon: . Ket qua:
-6-