Mã bù 1 là gì?
Mã bù 1 (one's complement) của một số nhị phân được tạo ra bằng cách đảo (nghịch đảo) toàn bộ các bit: mỗi bit 0 trở thành 1 và mỗi bit 1 trở thành 0. Vì kết quả phụ thuộc vào số lượng bit bạn dùng, bạn cần chọn một độ rộng bit như 4, 8, 16 hoặc 32 bit. Cách biểu diễn này từng được dùng trong các máy tính đời đầu để mã hóa số nguyên có dấu, và đến nay vẫn quan trọng khi học số học nhị phân cũng như các tổng kiểm tra (checksum) phát hiện lỗi.
Cách sử dụng máy tính này
Nhập một số thập phân không âm, chọn độ rộng bit, và máy tính sẽ giới hạn (mask) số đó theo độ rộng đã chọn, đảo toàn bộ các bit, rồi hiển thị kết quả ở cả dạng nhị phân lẫn thập phân. Nếu số của bạn lớn hơn mức mà độ rộng cho phép, chỉ những bit thấp nhất nằm trong độ rộng đó được giữ lại trước khi đảo.
Giải thích công thức
Ta tính
$$\text{Result} = \left(\sim\left(\text{Number} \,\&\, M\right)\right) \,\&\, M, \quad M = 2^{\text{Width}} - 1$$Số hạng \(2^{w} - 1\) là một mặt nạ gồm w bit 1 (với 8 bit thì đó là 11111111 = 255). Phép NOT theo bit (~) đảo từng bit của n, còn mặt nạ loại bỏ mọi bit vượt quá độ rộng đã chọn để kết quả luôn nằm trong phạm vi cho phép.
Ví dụ minh họa
Lấy số 5 với độ rộng 8 bit. Ở dạng nhị phân, \(5 = 00000101\). Đảo tất cả các bit ta được \(11111010\), tương đương 250 trong hệ thập phân. Vậy mã bù 1 của 5 trong 8 bit là 250. Với 4 bit, \(5 = 0101\), đảo lại thành \(1010 = 10\).
Câu hỏi thường gặp
Mã bù 1 khác mã bù 2 ở chỗ nào? Mã bù 2 (two's complement) cộng thêm 1 vào mã bù 1, nhờ đó tránh được việc số 0 có tới hai cách biểu diễn.
Mã bù 1 của số 0 là gì? Với 8 bit, đó là 11111111 = 255 — tất cả các bit đều thành 1.
Tại sao kết quả thay đổi theo độ rộng bit? Việc đảo bit phụ thuộc vào số lượng bit hiện có; độ rộng càng lớn thì càng có thêm nhiều bit 1 ở phía trước, tạo ra giá trị thập phân lớn hơn.