1. Decimal → Binary
Chia liên tiếp cho 2, lấy phần dư từ dưới lên.
13 / 2 = 6 dư 1
6 / 2 = 3 dư 0
3 / 2 = 1 dư 1
1 / 2 = 0 dư 1
→ Đọc ngược: 1101
Chương trình: Dùng hàm
#include <stdio.h>
long decToBin(int n) {
long bin = 0;
int pos = 1; // Vị trí chữ số (1, 10, 100...)
while (n > 0) {
bin += (n % 2) * pos;
n /= 2;
pos *= 10;
}
return bin;
}
int main() {
int n;
printf("Nhap so decimal: ");
scanf("%d", &n);
printf("Binary: %ld\n", decToBin(n));
return 0;
}
Kết quả
Nhap so decimal: 12
Binary: 1100
2. Binary → Decimal
Nhân từng bit với 2^vị_trí, cộng dồn.
1101 = 1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 8+4+0+1 = 13
Chương trình: Binary → Decimal
#include <stdio.h>
#include <math.h>
int binToDec(long bin) {
int dec = 0, pos = 0;
while (bin > 0) {
int bit = bin % 10;
dec += bit * (int)pow(2, pos);
bin /= 10;
pos++;
}
return dec;
}
int main() {
long bin;
printf("Nhap so binary: ");
scanf("%ld", &bin);
printf("Decimal: %d\n", binToDec(bin));
return 0;
}
Kết quả
Nhap so binary: 10011
Decimal: 19
Cách tốt hơn: Dùng bitwise (Không cần pow, math.h)
// Decimal -> Binary (in ra chuỗi)
void printBin(int n) {
if (n == 0) { printf("0"); return; }
char buf[33];
int i = 0;
while (n > 0) {
buf[i++] = (n & 1) + '0';
n >>= 1;
}
while (i--) putchar(buf[i]);
}
// Binary string -> Decimal
int binStrToDec(const char *s) {
int dec = 0;
while (*s) {
dec = (dec << 1) + (*s - '0'); // dec * 2 + bit
s++;
}
return dec;
}
So sánh phương pháp
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| Chia 2, nhân 10 (số nguyên) | Dễ hiểu, trả về int | Tràn số lớn (> 1023 cho 32-bit) |
| Bitwise + string | Không tràn, mọi kích thước | Phức tạp hơn |
| sscanf/printf %x | Chuẩn thư viện | Chỉ hex, không binary trực tiếp |
Chương trình hoàn chỉnh: Menu chuyển đổi
#include <stdio.h>
#include <string.h>
void decToBinStr(int n, char *buf) {
if (n == 0) { strcpy(buf, "0"); return; }
int i = 0;
while (n > 0) buf[i++] = (n & 1) + '0', n >>= 1;
for (int j = 0; j < i/2; j++) { char t = buf[j]; buf[j] = buf[i-1-j]; buf[i-1-j] = t; }
buf[i] = '\0';
}
int binStrToDec(const char *s) {
int n = 0;
while (*s) n = (n << 1) + (*s++ - '0');
return n;
}
int main() {
int chon, n;
char bin[33];
do {
printf("\n1. Dec -> Bin\n2. Bin -> Dec\n0. Thoat\nChon: ");
scanf("%d", &chon);
switch (chon) {
case 1:
printf("Nhap so dec: "); scanf("%d", &n);
decToBinStr(n, bin);
printf("Binary: %s\n", bin);
break;
case 2:
printf("Nhap so bin: "); scanf("%s", bin);
printf("Decimal: %d\n", binStrToDec(bin));
break;
}
} while (chon != 0);
return 0;
}
Lưu ý
- Binary dạng số nguyên (1101) giới hạn ~10 bit (int 32-bit)
- Binary dạng string không giới hạn độ dài
- Bitwise (
&,|,^,~,<<,>>) nhanh hơn chia/nhân - C23 có
0bprefix cho binary literal:int x = 0b1101;