Trường ĐẠI HỌC CÔNG NGHIỆP THỰC PHẨM TP HỒ CHÍ MINH Khoa CÔNG NGHỆ THÔNG TIN Tiểu luận Môn Kiến Trúc Máy Tính Đề tài THỰC HIỆN CÁC PHÉP TÍNH CỘNG, TRỪ, NHÂN, CHIA SỐ NHỊ PHÂN 32 BIT 1 MỤC LỤC 1 Lý thu[.]
Trường: ĐẠI HỌC CƠNG NGHIỆP THỰC PHẨM TP HỒ CHÍ MINH Khoa: CƠNG NGHỆ THƠNG TIN Tiểu luận: Mơn: Kiến Trúc Máy Tính Đề tài: THỰC HIỆN CÁC PHÉP TÍNH CỘNG, TRỪ, NHÂN, CHIA SỐ NHỊ PHÂN 32 BIT MỤC LỤC Lý thuyết 1.1 Số nhị phân 1.2 Các phép toán số nhị phân 1.2.1 Phép cộng .3 1.2.2 Phép trừ 1.2.3 Phép nhân .4 1.2.4 Phép chia .5 Ý tưởng cho thuật toán 2.1 Phép cộng 2.2 Phép trừ 2.3 Phép nhân 2.4 Phép chia 10 Lý thuyết 1.1 Số nhị phân Có hệ số có số riêng như: Binary (hệ nhị phân), Octagonal (hệ bát phân), Hexagonal (hệ thập lục phân), Decimal (hệ thập phân) Chúng sử dụng rộng rãi hệ thống số Trong hệ nhị phân chiếm ưu hệ thống máy tính Trong hệ nhị phân, có hai chữ số, Các chữ số ký hiệu nhị phân có ý nghĩa ký hiệu thập phân: Trong số nguyên có dấu A: biểu diễn n bit sau: a n−1 a n−2 … a2 a1 a0 A số dương: bit a n−1=0 A số âm: bit a n−1=1; Các bit lại biểu diễn độ lớn số ngun khơng dấu 1.2 Các phép tốn số nhị phân 1.2.1 Phép cộng Phép tính đơn giản hệ nhị phân tính cộng Cộng hai đơn vị hệ nhị phân làm sau: 0+0=0 0+1=1 1+0=1 + = (nhớ 1) Ví dụ: 1.2.2 Phép trừ Phép tính trừ theo quy chế tương tự: 0−0=0 − = (mượn 1) 1−0=1 1−1=0 Một đơn vị nhị phân trừ với đơn vị nhị phân khác sau: 1.2.3 Phép nhân Phép tính nhân hệ nhị phân tương tự phương pháp làm hệ thập phân Hai số A B nhân với tích số cục bộ: với số B, tích với số A tính viết xuống hàng mới, hàng phải chuyển dịch vị trí sang bên trái, hầu cho số cuối bên phải đứng cột với vị trí số B dùng Tổng tích cục cho ta kết tích số cuối Vì có số hệ nhị phân, nên có kết khả quan tích cục bộ: Nếu số B 0, tích cục Nếu số B 1, tích cục số A Ví dụ, hai số nhị phân 1011 1010 nhân với sau: 1.2.4 Phép chia Tính chia nhị phân tương tự phép chia hệ thập phân Ở ta có số bị chia 11011, 27 số thập phân, số chia 101, số thập phân Cách làm tương tự với cách làm số thập phân Ở ta lấy số đầu số bị chia 110 để chia với số chia, tức 110, 1, viết lên hàng kẻ Kết nhân với số chia, tích số trừ với số đầu số bị chia Số số hạ xuống để tạo nên dãy số có số, tương tự với số lượng số số chia: Quy luật lặp lại với hàng số mới, tiếp tục tất số số bị chia dùng hết: Phân số 11011 chia cho 101 101, liệt kê phía đường kẻ, số dư lại viết hàng cuối 10 B=2D Trong hệ thập phân, 27 chia cho 5, dư 2 Ý tưởng cho thuật toán *** Thuật toán áp dụng cho phép tính số ngun khơng dấu 2.1 Biến dung chung Các hàm ***Mảng kết nói chung mảng khác thuật toán miêu tả sau: (mảng A có a phần tử) a-1 a-2 a-3 A[a-1] A[0] int no = 0; int nho = 0; int[] A = new int[32]; int a; int[] B = new int[32]; int b; string X, Y;//chuỗi lấ! y từ ỗ "Nhập sỗ!nhị phấn 1" "Nhập sỗ! nhị phấn 2" cách click btnBackUp int x, y;//sỗ!bit ban đấ4 u lấ! y từ string X,Y int[] MangX = new int[32];//sau gọi hàm StringToArray ma ;ng MangA,MangB int[] MangY = new int[32]; int KiemTra(int[] A, int a) //không phai sơ nhị phân return void PhepCong(int[] A, int[] B, int[] C, int c) //cộng mang A, B có sơ bit c, kết qua lưu vào mang C void PhepTru(int[] A, int[] B, int[] C, int c) //trừ mang A, B có sơ bit c, kết qua lưu vào mang C void HoanVi(ref int u, ref int v) //đôi chô bit, dùng hàm DaoMang void DaoMang(int[] A, int a) //đao mang void CharToInt(char a, out int gt) //chuyến bit kiếu char thành bit kiếu int void StringToArray(string TextBox, int[] A, out int a) //Mang thu đuược Chỉ sô từ trái đô? ng thời xác định sô bit ban đâ? u cua sô nhị phân int ss2Bit(int a, int b) //nếu bit a lớn bit b return 1, ngược lại return -1 int soSanh(int[] A, int[] B) //so sanh mang cung 32 bit bang return 0, A>B return 1, A tràn số 2.3 Phép trừ Gọi hàm void PhepTru(int[] A, int[] B, int[] C, int c, ref int no) Tạo mảng C mảng kết thu có 32 bit - Hai mảng A,B 32 bit đánh số 0,1,2….,31 từ phải qua trái - So sánh hai mảng để biết có trừ hay khơng: int ss2Bit(int a, int b)//nếu bit a lớn bit b return 1, ngược lại return -1 { if (a > b) return 1; else return -1; } - Không trừ mảng A< mảng B=>thong báo tràn số - Sử dụng vòng lặp for chạy từ phần tử i=0 đến phần tử i=31, trừ cặp bit dựa vào biến “no” khởi tạo ban đầu - Thực xong vòng lặp ta C mảng kết 32 bit biến “no” trả mang giá trị - Nếu “no” trả 1=> tràn số 2.4 Phép nhân Nhân mảng MangX mảng MangY có x,y phần tử bit sô nhị phân Mảng lấy nhấn vào button “Nhập xong” Việc Backup nhầm mục đích kiểm tra liệu ban đầu nhập vào( có vượt 32 bit, có nhập số khác hay không), lưu lại, đồng thời biến đổi liệu thành mảng gồm bit số nhị phân: void BackUp()//sao lưu lại liệu ban đâ? u dùng cho phép nhân/chia { X = txtNhap1.Text; Y = txtNhap2.Text; StringToArray(X, MangX, out x);//mang có sơ đánh từ bến trái DaoMang(MangX, x);//đao mang đế mang đánh sô từ bến phai StringToArray(Y, MangY, out y); DaoMang(MangY, y); } BackUp có gọi hàm StringToArray() để chuyển chuổi nhập vào thành mảng kí tự: void StringToArray(string TextBox, int[] A, out int a)//Mang thu đucợ Chỉ sô từ trái đô? ng thời xác định sô bit ban đâ? u cua sô nhị phân { string l = TextBox; a = l.Length; Char[] L = Convert.ToString(l).ToCharArray();//chuoi mang ki tu for (int i = 0; i < a; i++) { char j = L[i]; int gt; CharToInt(j, out gt);//chuyen kieu ki tu sang so nguyen A[i] = gt; 10 } } Và biến mảng kí tự thành mảng số nguyên gồm số bit số nhị phân thông qua hàm CharToInt(): Gọi hàm DaoMang() để mảng đánh số mong muốn: sau chuyển mảng thu được: Vd: chuổi 1010101111 Sau chuyển mảng 1 0 void DaoMang(int[] A, int a) { for (int i = 0, j = a - 1; i < j; i++, j ) HoanVi(ref A[i], ref A[j]); }//đao mang Gọi đảo mảng được: 1 1 - Trong phép toán nhân này, ta dùng MangX có x phần tử, MangY có y phần tử - Ta tạo mảng C có c phần tử bit 0, c=x+y - Dùng vòng lặp for lấy phần tử MangY:i chạy từ 0-> y-1 Với mõi giá trị i, ta tạo mảng tam có c bit Lấy phần tử MangY nhân với tất phần tử MangX-> ghi kết vào mảng tam-> cộng kết mảng tam với mảng C-> C Lần lượt thực hết số phần tử MangY( y-1) Sau thực ta cộng kết tam C vừa thực trên( lần tam lùi lại đơn vị)=> kết cuối C 11 - Tùy cách biến đổi mà chuyển mảng C thành chuổi Text để xuất - Nếu c=x+y>32 => tràn số *** với cách tính vậy, gặp lỗi MangY có bit MangX có 32 bit c=32+1=33>32 Nên ta có trường hợp ngoại lệ phép nhân này, có sử dụng hàm dung để kiểm tra: int KTNgoaiLe(int[] A, int a)//nhân/chia mang với mang có giá trị hoạc { if (a == 1) return 1; else return 0; } if ((KTNgoaiLe(MangX, x) == 1) || (KTNgoaiLe(MangY, y) == 1)) { if (KTNgoaiLe(MangX, x) == 1) { if (MangX[0] == 0) for (int i = 0; i < 32; i++) C[i] = 0; else for (int i = 0; i < 32; i++) C[i] = B[i]; } else { if (MangY[0] == 0) for (int i = 0; i < 32; i++) C[i] = 0; else for (int i = 0; i < 32; i++) C[i] = A[i]; } string kq = ""; for (int i = 31; i >= 0; i ) kq += C[i]; txtXuatKQ.Text = kq; } 2.5 Phép chia - B1 : Mảng MangX( lưu từ A) với x bit(đây số bit ban đầu), số đánh từ bên phải Mảng MangY(sao lưu từ B) với y bit(y số bit bang đầu), số đánh từ bên phải 12 Mảng tam khởi tạo với y-1 bit ban đầu lấy từ mảng MangX: • tam[0]=MangX[(x-1)-0] • tam[1]=MangX[(x-1)-1] • … • tam[y-2]=MangX[(x-1)-(y-2)] =MangX[x-y+1] while (j < y - 1)// lay tam[] tu MangX[] co y-1 bit { tam[j] = MangX[x - - j]; j++; } - B2: Cho vòng lặp for bit MangX (x-y) đến hết Lấy lần lược nhóm (y+j) bit từ mảng MangX( mảng tam) với j: 0->x-y so sánh với mảng MangY, thực phép trừ : + Nếu tam[]= 0) { C[c] = 1; if (soSanh(tam, CopyY) > 0) PhepTru(tam, B, tam, j + 1, ref no); else for (int i = 0; i < j + 1; i++) tam[i] = 0; } else { C[c] = 0; } DaoMang(tam, j + 1); c++; j++; CopyY[n_CopyY] = 0; n_CopyY++; } VD: BƯỚC 1: • MangX – x bit ( ví dụ x=10): 1011010010: MangX[9 ] MangX[8 ] MangX[7 ] MangX[6 ] 1 0 MangX[0 ] • CopyY - n_CopyY bit( ví dụ bit): 10111: CopyY[4] CopyY[3 ] 0 MangX[9] MangX[8] MangX[7] MangX[6] 1 • CopyY[0] 1 Tam[] lấy từ MangX 14 BƯỚC 2: MangX[9] MangX[8] MangX[7] MangX[6] MangX[5] 1 Đảo mảng tam[] lại để thực trừ cho MangY MangX[5] MangX[6] MangX[7] MangX[8] MangX[9] 1 ***Trong ví dụ tam= 0; k )//tiep tuc lay ptu tu MangX de du y bit { tam[j] = MangX[k]; DaoMang(tam, j + 1); if (soSanh(tam, CopyY) >= 0) { C[c] = 1; if (soSanh(tam, CopyY) > 0) PhepTru(tam, B, tam, j + 1, ref no); else for (int i = 0; i < j + 1; i++) tam[i] = 0; } else { C[c] = 0; } } DaoMang(tam, j + 1); c++; j++; CopyY[n_CopyY] = 0; n_CopyY++; Kết thu mảng C số dư mảng tam Phép chia không tràn số nhiên nhận thông báo “không chia được” MangY mang giá trị 16 int KTChia0(int[] A, int a)//kiếm tra xem mang A có phai tồn bit 0, dùng chia sô với { for (int i = 0; i < a; i++) if (A[i] == 1) return 0; return 1; } 17