PowerPoint Presentation VIẾT CHƯƠNG TRÌNH THỰC HIỆN CÁC PHÉP TOÁN CỘNG, TRỪ, NHÂN, CHIA TRÊN SỐ NHỊ PHÂN 32 BIT Đề tài HỆ NHỊ PHÂN Hệ nhị phân (hay hệ đếm cơ số hai) là một hệ đếm dùng hai ký tự để[.]
Trang 1VIẾT CHƯƠNG TRÌNH THỰC HIỆN CÁC PHÉP TOÁN CỘNG, TRỪ, NHÂN, CHIA
TRÊN SỐ NHỊ PHÂN 32 BIT
Đề tài:
Trang 3CÁC PHÉP TOÁN TRÊN SỐ NHỊ PHÂN
Trang 4CÁC PHÉP TOÁN TRÊN SỐ NHỊ PHÂN
Trang 5CÁC PHÉP TOÁN TRÊN SỐ NHỊ PHÂN
Phép nhân:
Phép tính nhân trong hệ nhị phân cũng tương tự như phương pháp làm trong hệ thập phân.
2
Trang 6CÁC PHÉP TOÁN TRÊN SỐ NHỊ PHÂN
Phép chia:
Phép tính chia trong hệ nhị phân cũng tương tự như phương pháp làm trong hệ thập phân Ví dụ:
2
Trang 7Ý tưởng thuật toán trên C#
A[a-1] A[1] A[0]
Mảng kết quả nói chung và các mảng khác trong thuật toán này được miêu tả như một mảng được đánh số 0 bắt đầu từ phía bên phải Vì các phép toán cộng trừ đều bắt đầu từ bít bên phải
Ví dụ mảng A có a phần tử được miêu tả:
Trang 8Ý tưởng thuật toán trên C#
Các biến và mảng dùng chung:
Trang 9Ý tưởng thuật toán trên C#
Các hàm con được sử dụng :
Trang 10Ý tưởng thuật toán trên C#
Các hàm con được sử dụng :
Trang 11Ý tưởng thuật toán trên C#
Giao diện chương trình:
Trang 12Button “Nhập xong”
Sao khi nhập số nhị phân vào thì bắt buộc người dùng phải click vào
button “nhập xong” để tiếp tục chương trình Việc bắt buộc nhập này nhầm mục đích:
Sao lưu lại chuỗi nhập vào ban đầu thành chuỗi X và Y, chuyển 2 chuỗi này thành mảng số nhị phân( đánh số 0 từ bên trái) và tìm ra số bit của chúng (x và y).
Đảo mảng MangX, MangY lại để được cách đánh chỉ số mong muốn.
Vd: Số nhị phân 10010001 nhập vào
Sao khi gọi LayMang(): 1 0 0 1 0 2 1 3 0 4 0 5 0 6 1 7
Gọi DaoMang() để được mảng: 1706051403020110
Đồng thời kiểm tra mảng nhập vào có phải là số nhị phân không.
Trang 14Hàm con KiemTra() :
int KiemTra(int[] A, int a)
{
for (int i = a - 1; i >= 0; i )
if (A[i] != 0 && A[i] != 1)
Trang 15Button “Đặt lại”
Khi click vào đây, các dữ liệu nhập vào trước đó sẽ bị xóa để nhập mới Đồng thời các kết quả xuất hiện trước đó cũng bị xóa.
Các nút lệnh “Cộng”, “Trừ”, “Nhân”, “Chia” sẽ bị dấu đi, bắt buộc
người dùng phải click “Nhập xong” để tiếp tục.
Trang 16Button “Thoát”
Click vào đây, một hộp thoại xuất hiện:
Click Yes để thoát khỏi chương trình.
Click No để quay trở lại chương trình
Trang 193 Với biến nhớ thay đổi thành 1:
Trang 20 Sau khi thực hiện xong vòng lặp, được mảng kết quả là C có 32 bit và biến “nho” trả về có giá trị 1 hoặc 0.
Tùy cách biến đổi mà chuyển mảng C thành chuổi Text để xuất ra
ngoài
Nếu tại i=31, “nho=1”=> tràn số
Trang 21PHÉP TRỪ
Hai mảng A,B cùng 32 bit được đánh số 31,
30… 2,1,0 (nhìn từ trái sang phải).
Sử dụng vòng lặp for chạy từ phần tử i=0 đến phần tử i=31, trừ từng bit dựa vào biến “nho”:
Với biến “no” ban đầu khởi tạo bằng 0:
Trang 23Với biến nợ thay đổi thành 1
Trang 24 Phép toán này cần so sánh hai mảng:
bit bang nhau return 0, A>B return 1, A<B return -1
Trang 25 Dùng MangX và MangY đã sao lưu lại để thực hiện.
Ta tạo mảng C có c phần tử đều là bit 0, trong đó c=x+y
Dùng vòng lặp for lấy từng phần tử của MangY:i chạy từ 0-> y-1
Với mõi giá trị i, ta tạo mới 1 mảng tam có c bit đều bằng 0
Lấy phần tử đầu tiên của MangY nhân lần lượt với tất cả các phần tử của MangX-> ghi kết quả vào mảng tam-> cộng kết quả của mảng tam với mảng C-> được C mới
PHÉP NHÂN
Trang 263
Trang 30 Lần lượt thực hiện cho đến khi hết số phần tử của MangY( y-1) Sau mỗi lần thực hiện ta cộng kết quả của tam và C vừa thực
hiện ở trên( cứ mỗi lần như vậy tam sẽ lùi lại 1 đơn vị)=> kết
Trang 33 Cho vòng lặp for bắt đầu từ bit tiếp theo của MangX (x-y) đến hết Lấy lần lược từng 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, và thực hiện phép trừ :
+ Nếu tam[]<=MangY[]: C[i]=0
• Nếu tam[]<MangY[]: tam[] như cũ
• Nếu tam[]=MangY[]: tam[] có tất cả bit đều bằng 0 + Ngược lại: C[i]=1, tam[]=tam[]-MangY
dần từ (y-1) đến x bit trong khi MangY thì vẫn y bit không đổi, nên không gọi được PhepTru() Để gọi PhepTru() thì tam[] và MangY[] phải cùng số bit nên để dễ dàng và không ảnh hưởng đến việc thực hiện phép nhân, ta dùng mảng CopyY với n_CopyY lấy từ MangY[]:
Trang 35tam //[]tam sau khi đảo
Thực hiện soSanh( tam, CopyY )
Trang 374
Trang 38//Hết vòng lặp for
[]du=[]tam; Số dư = 1
Trang 39//Hết vòng lặp for
[]du=[]tam; Số dư = 1