Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Chuyển đổi Decimal sang Binary và ngược lại trong C

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ề intTràn số lớn (> 1023 cho 32-bit)
Bitwise + stringKhông tràn, mọi kích thướcPhức tạp hơn
sscanf/printf %xChuẩn thư việnChỉ 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ó 0b prefix cho binary literal: int x = 0b1101;