Phép Toán Cơ Bản Trên Hệ Nhị Phân. Help? [Archive]
Có thể bạn quan tâm
Diễn Đàn Tin Học > Lập trình > Các ngôn ngữ lập trình > C/C++ > Phép toán cơ bản trên Hệ nhị phân. Help? PDA
View Full Version : Phép toán cơ bản trên Hệ nhị phân. Help?
Than Dieu19-02-2006, 12:01Em cũng phải tự nhận trước là em hơi ngốc mấy cái này, các anh đừng cười nhé. Chỉ cho em cặn kẽ chút nhé. Các anh giải thích cho em cơ chế, nguyên tắc của các phép toán Logic trên hệ Binary sau nhé: 1. Phép bù 1: Có phải là cộng thêm 1 ko? Tại sao 1101 thì bù 1 của nó lại là 0010? 2. Phép bù 2 kết quả như là như thế nào? 3. Phép trừ kiểu 2 = phép cộng số bù 2 nghĩa là sao? 4. Phép dịch Shift (Các anh hiêu thì giúp em nhé, cặn kẽ chút chứ đừng nói như sách hay như ông thầy giảng) 5. Phép nhân kiểu 2 = phép cộng phối hợp với phép dịch(Cái này em cũng lơ tơ mơ rùi nhưng em muốn hỏi cách anh cho rõ ràng hơn) Thực ra lúc trước học em ko có để ý bữa nay cần đến thành ra ko hiểu. Mong các anh chỉ cho em cặn kẽ nhé, chứ chung chung là em rốt em ko có hiểu. EM xin cảm ơn các anh trước nhé. DoQuocDuy19-02-2006, 13:30ví dụ trong hệ thập phân cho dễ hiểu nhé. bù 10 của 4 là 6 (10 = 4 + 6), bù 10 của 7 là 3 (10 = 7 + 3). bù 10 của 97 là 3 (100 = 97 + 3)... Từ đó rút ra: để tính bù 10 của số a gồm có n chữ số thì làm như sau: gọi ~a là bù 10 của a: ~a = 10^n - a; cách khác đơn giản hơn để tính bù 10 của a người ta đưa khái niệm bù 9. để tính bù 9 của a thì ta lấy số có n chữ số 9 trừ đi a, được kết quả. Đem kết quả đó cộng thêm 1 thành bù 10 của a. Ví dụ: tính bù 10 của 127(gồm 3 chữ số). Bù 9 của 127 = 999 - 127 = 872 bù 10: 872 + 1 = 873. Trong hệ nhị phân phép bù cũng tương tự như vậy. Bù 1 của 10 là 01, 1010 là 0101,... để tính bù 1 của một số nhị fan a gồm có n chữ số thì lấy số nhị phân gồm n chữ số 1 trừ đi a. ví dụ: bù 1 của 1101 = ? 1111 - 1101 ---- 0010 <-- kết quả Để ý ta thấy kết quả là bù 1 là sự chuyển bit: bit 1 -> 0, 0 -> 1. Trong thực hành ta làm như vây. 3. Bù 2 là bù 1 cộng thêm 1. Ứng dụng của số bù 2 để lưu trữ số âm trong máy tính (rất tiện lợi) 4. phép dịch bit (shift operator): gồm có dịch trái và dịch phải Dịch trái:( << ) Ví dụ, dịch trái 10 1 bit ta được 100. Xem hình mô tả sau: giả sử 10 được lưu trong máy tính với 8 bit: | | | | | | |1|0| | | | | | |1|0|0| <- bit cuối thêm vào bít 0 dịch 2 bit: | | | | |1|0|0|0| - - <-- 2 bit trống them vào 2 bit 0 (00) Ta nhận thấy cứ dịch trái 1 bit thì giá trị của số đc dịch tăng lên 2, 2 bit thì tăng 4,..., n bit thì tăng 2^n. Như vậy: x << n = x*(2^n) (dịch trai x n bit) Dịch phải: >> Xem ví dụ minh họa: dịch phải 10 1 bit. | | | | | | |1|0| chuyển các bit sang phải 1 ô, bit 0 ngoài cùng loại bỏ, tại vị trí của bit 1 ta thay vào đó bằng bit 0. | | | | | | |0|1| Như vậy khi dịch phải 1 bit thì giá trị của số bị dịch giảm đi 2. Dịch phải n bit thì giảm 2^n. 5. Từ 2 phép dịch trên để tính phép nhân của một số với một số là lũy thừa của 2 (tức có dạng: 2^n )ta chỉ cần dịch trái n bit số đó là được kết quả. Phép chia thì ngược lại. Phép dịch thực hiện nhanh hơn phép chia rất nhiều, nên trong khi lập trình có một phép chia hay nhân cho một số lũy thừa của 2 ta sử dụng phép dịch chương trình sẽ chạy nhanh hơn. có gì sai sót các bạn bổ sung thêm. Xin cảm ơn. Than Dieu19-02-2006, 15:04Khoan đã anh Duy: Giả sử máy tính lưu số với 8 bit, và em có một số như sau: 11001011. Vậy Bù 2 của nó là bao nhiêu? ? Khi dịch bit thì nó sẽ như thế nào ? Khi nhân nữa nó sẽ ra sao? anh lấy cho em một ví dụ cụ thể về nhân kiểu 2 nhé noname.cpp19-02-2006, 15:17Bổ xung một chút : 3.Với số được biểu diễn dưới dạng bù 2 thì phép trừ có thể đưa được về phép công thông thường.Dễ dàng thấy tổng 2 số dạng bù 2 cũng là một số dạng bù 2 thể hiện đúng kết quả phép cộng ở dạng số nguyên bình thường. ví dụ : (để đơn giản ta giả sử có một kiểu dữ liệu chỉ có 4 bit) 7 - 3 = 7 + (-3) = 0111 + 1101 = (1)0100 = 4; 5.Ta có thể đưa phép nhân về phép cộng và phép dịch bit ví dụ 4*5 = 4*(2^2 + 2^0) = 4*2^2 + 4*2^0 Vinhie4719-02-2006, 21:38Khoan đã anh Duy: Giả sử máy tính lưu số với 8 bit, và em có một số như sau: 11001011. Vậy Bù 2 của nó là bao nhiêu? bù 1 là 00110100 =>bù 2 là 00110101. Khi dịch bit thì nó sẽ như thế nào ? Dịch thế nào? trái hay phải và nếu dịch thì dịch mấy? Khi nhân nữa nó sẽ ra sao? anh lấy cho em một ví dụ cụ thể về nhân kiểu 2 nhé Không hiểu! Than Dieu19-02-2006, 22:45EM đã hiểu phần bù rùi. Cảm ơn anh Duy nhé. Dịch thế nào? trái hay phải và nếu dịch thì dịch mấy? Ah, cái này hả anh. Có nghĩa là em có một số 8 bit như ở trên đó khi dịch phải hay dịch trái đều ko đúng với quy tắc mà anh Duy nói . Ko thể tăng thêm 2^n khi dịch trái vì kiểu dữ liệu máy tính cũng chỉ có 8 bit. Ý em hỏi là có thể bảo toàn quy tắc trên không? Nếu có làm như thế nào? Ko thể thì sẽ ra sao? Kiểu nhân phải cảm ơn Noname. Còn một vấn đề nữa mà em vẫn chưa hiểu là lưu số âm: Bù 2 để lưu số âm? Em chưa hiểu tại sao đâu? Cách tính số âm đó như thế nào? làm sao để nhận biết số đó là bù 2? số đó là số âm ? VD như của anh Noname trên số 1101 =-3 tại sao lại vậy? Các anh giúp em giải thích mấy cái này nhé Các anh giúp em nhé, em thật sự cũng mới học cái này, và bây giờ có cần dùng nó đôi chút xem lại nhưng những thứ đó em mất hết ý thức để tự suy luận ra cho mình hiểu. Rất cần các anh giúp em noname.cpp20-02-2006, 00:52Còn một vấn đề nữa mà em vẫn chưa hiểu là lưu số âm: Bù 2 để lưu số âm? Em chưa hiểu tại sao đâu? Cách tính số âm đó như thế nào? làm sao để nhận biết số đó là bù 2? số đó là số âm ? VD như của anh Noname trên số 1101 =-3 tại sao lại vậy? Các anh giúp em giải thích mấy cái này nhé Vẫn dùng kiểu dữ liệu 4 bit như trên thay vì 8,16... để cho dễ hiểu Biểu diễn số bù 2 ta dùng bit cao nhất để biểu diễn dấu ,0 là dương ,1 là âm.Vậy ta chỉ còn 3 bit để biểu diễn giá trị của nó. Với số dương thì biểu diễn nhị phân như bình thường ví dụ 3 = 0011, 4 = 0100 Còn số âm thì 3 bit sau là dạng bù 2 của nó.Quy tắc tính bù 2 chắc là bạn biết rồi.dạng bù 2 của một số a ,n bit là 2^n-a. Vậy -3 = 2^4-3 = 13 = 1101. II.Vậy tại sao phải biểu diễn ở dạng bù 2 Nhằm biểu diễn số âm và do đó đưa được phép trừ về phép cộng vì ở mức thấp phép trừ không được hỗ trợ. Ta hoàn toàn có thể chứng minh rằng phép cộng 2 số bù 2 sau khi bỏ bớt phần tràn là một số bù 2 biểu diễn đúng kết quả của phép cộng 2 số nguyên vì thực ra khi biểu diễn ở dạng bù 2 của một số âm ta đã thêm vào 2^n. Và khi cộng vào ,phần 2^n sẽ vượt giới hạn của kiểu dữ liệu đó và bị loại đi. Ví dụ: 7 + (-3) = 0111 + 1101(dạng bù 2) = 0111 + (10000-0011) = (0111-0011) + 10000 = 0100 + 10000 . Bỏ phần bị tràn 10000 sẽ được kết quả mong muốn. Than Dieu20-02-2006, 18:52Cảm ơn anh Noname, bài viết của anh dễ hiểu lắm. Nhưng em còn một ý nữa ở trên đó. Giúp em nốt đi các anh. DoQuocDuy08-03-2006, 13:06Cảm ơn anh Noname, bài viết của anh dễ hiểu lắm. Nhưng em còn một ý nữa ở trên đó. Giúp em nốt đi các anh. Than Dieu kô hiểu chỗ nào? Than Dieu09-03-2006, 13:09Chỗ này anh ah Ah, cái này hả anh. Có nghĩa là em có một số 8 bit như ở trên đó khi dịch phải hay dịch trái đều ko đúng với quy tắc mà anh Duy nói . Ko thể tăng thêm 2^n khi dịch trái vì kiểu dữ liệu máy tính cũng chỉ có 8 bit. Ý em hỏi là có thể bảo toàn quy tắc trên không? Nếu có làm như thế nào? Ko thể thì sẽ ra sao? Cảm ơn các anh đã giúp đỡ em nhé DoQuocDuy20-03-2006, 20:59Chỗ này anh ah Ah, cái này hả anh. Có nghĩa là em có một số 8 bit như ở trên đó khi dịch phải hay dịch trái đều ko đúng với quy tắc mà anh Duy nói . Ko thể tăng thêm 2^n khi dịch trái vì kiểu dữ liệu máy tính cũng chỉ có 8 bit. Ý em hỏi là có thể bảo toàn quy tắc trên không? Nếu có làm như thế nào? Ko thể thì sẽ ra sao? Cảm ơn các anh đã giúp đỡ em nhé Đây là qui tắc tổng quát của phép dịch còn trong thực tế như anh được biết thì hầu hết máy tính cá nhân chúng ta xài hiện nay lưu trữ số thực với độ chính xác đơn (single precision) dùng 32 bit và độ chính xác kép thì dùng 64 bit (double precision). Chuẩn lưu trữ thống nhất là IEEE 754, trong chuẩn này số thực cố độ chính xác đơn được biều diễn: R = (-1)^S * 2^E * (1.M) Với: S là bít dấu chiếm 1 bit (0/1) E là Số mũ chiếm 8 bit M là phần định trị chiếm 23 bit Tổng cộng 32 bit Số thực với độ chính xác kép cũng biều diễn tương tự nhưng khác ở chỗ E chiếm 11 bit, M chiếm 52 bit còn S vần chiếm 1 bit. (Tổng cộng 64 bit). Như vậy khi số thực đó quá lớn thì xảy ra vấn đề tràn (overflow) và phần định trị (M) sẽ bị bỏ bớt một số bit sao cho chỉ còn 23 bit hoặc 52 bit. Có gì sai mong các bạn bổ sung. mtt33321-03-2006, 00:23Chỉ xin góp ý một chút cho chính xác hơn. Hầu hết máy tính cá nhân chúng ta xài hiện nay lưu trữ số thực với độ chính xác đơn (single precision) dùng 32 bit và độ chính xác kép thì dùng 64 bit (double precision). - Đúng là có xài nhưng không phải trường hợp nào cũng xài. Trong nhiều trường hợp vẫn xài các kiểu dữ liệu char, int, ... Như vậy khi số thực đó quá lớn thì xảy ra vấn đề tràn (overflow) và phần định trị (M) sẽ bị bỏ bớt một số bit sao cho chỉ còn 23 bit hoặc 52 bit. Có gì sai mong các bạn bổ sung. - Khi quá lớn thì xảy ra tràn và tràn là tràn, không có chuyện M sẽ bị bỏ bớt một số bit. Ah, cái này hả anh. Có nghĩa là em có một số 8 bit như ở trên đó khi dịch phải hay dịch trái đều ko đúng với quy tắc mà anh Duy nói . Ko thể tăng thêm 2^n khi dịch trái vì kiểu dữ liệu máy tính cũng chỉ có 8 bit. Ý em hỏi là có thể bảo toàn quy tắc trên không? Nếu có làm như thế nào? Ko thể thì sẽ ra sao? Cảm ơn các anh đã giúp đỡ em nhé Vấn đề là bài toán của chú có cần dùng hết 8 bit không. Ví dụ chú chỉ đếm từ 1 > 100 thì trong khoảng đó chắc chắn khi dịch trái quy tắc vẫn đảm bảo. Mà nếu dùng hết thì ghép 2 byte lại dịch trái tha hồ. Nếu vẫn chưa đủ thì ghép 4 byte lại. Nhưng máy tính luôn có giới hạn, đừng trông mong sẽ có thể ghép n byte tùy thích. Vì vậy có thể nói chỉ cần nó thỏa mãn trong miền bài toán của mình. Tỷ như nếu chỉ cần đếm từ 1 > 100 là miền bài toán của chú thì dịch trái trong 8 bit là quá dư rồi, không cần gì hơn nữa. Lại nói đến miền của bài toán là cách điều chỉnh miền bằng thứ nguyên. Ví dụ chú làm bài toán cân đo đong đếm xe tải mà chú dùng Kg thì chú sẽ tốn nhiều byte để lwu trữ mà cũng khó "bảo toàn" như chú nói. Tốt nhất là dùng đơn vị tấn, thì tự dưng miền bài toán nhỏ xuống không phải lưu đến hàng nghìn hàng vạn Kg nữa mà chỉ cần lưu trữ vài tấn. Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.Từ khóa » Cách Tìm Số Bù 2
-
Bù 2 – Wikipedia Tiếng Việt
-
Số Bù 2 Là Gì? Cách đổi Số Bù 2, Phương Pháp Bù 2, Biểu Diễn Số Bù ...
-
Bù 2 Của Số âm, Cách đổi Số Bù 2, Phương Pháp Bù 2 Mới Nhất 2021
-
Cách Biểu Diễn Số âm Trong Máy Tính (phương Pháp Bù 2)
-
Mã Bù 1, Mã Bù 2 Của Một Số Dương - âm - Randomq - Dạy Nhau Học
-
Bù 2 (hệ Nhị Phân) - Thư Viện Học Liệu Mở Việt Nam (VOER)
-
Bù 2 Biểu Diễn Số âm - Tieng Wiki
-
CÁC HỆ THỐNG ĐẾM] BÙ 2 CỦA 1 SỐ NHỊ PHÂN - YouTube
-
Biểu Diễn Số Nguyên Trong Máy Tính Và Số Bù 2 - YouTube
-
Bù 2 - SlideShare
-
Note Về Số Bù 2 (2 Complement) - Kipalog
-
Phép Cộng Với Số Bù 2 - Tài Liệu Text - 123doc
-
Bài Giảng Môn Học Cấu Trúc Máy Tính Bài 7 Biểu Diễn Dữ Liệu - 123doc
-
Phép Trừ Số Nhị Phân Dùng Số Bù 2