Bù 2 của số nhị phân tính bằng 2 cách:
- Chuyển sang bù 1 (đảo bit) rồi cộng 1.
- Từ LSB: giữ nguyên các 0 sau bit 1 đầu tiên, bit 1 đó giữ nguyên, các bit còn lại đảo ngược.
Thuật toán code
Tính bù 1:
for i=0..SIZE-1:
if num[i]=='0' one[i]='1';
else one[i]='0';
Tính bù 2 từ bù 1 (cộng 1):
carry = 1;
for i=SIZE-1 downto 0:
if one[i]=='1' && carry==1: two[i]='0';
else if one[i]=='0' && carry==1: two[i]='1'; carry=0;
else two[i]=one[i];
Chương trình hoàn chỉnh (8 bit)
#include <stdio.h>
#include <stdlib.h>
#define SIZE 8
int main() {
char num[SIZE+1], one[SIZE+1], two[SIZE+1];
int i, carry = 1;
printf("Nhap so nhi phan (8 bit): ");
scanf("%s", num);
// Bu 1
for (i=0; i=0; i--) {
if (one[i]=='1' && carry) { two[i]='0'; }
else if (one[i]=='0' && carry) { two[i]='1'; carry=0; }
else two[i]=one[i];
}
two[SIZE] = '\0';
printf("Bu 2: %s\n", two);
return 0;
}
Kết quả
Nhap so nhi phan: 1000010 Bu 1: 0111101 Bu 2: 0111110