首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言十進位轉二進位:遞迴與迭代兩種經典實現

     編輯:關於C

方法一:遞迴除二取餘法

#include <stdio.h>

void decToBin(int n) {
    if (n / 2 > 0)
        decToBin(n / 2);
    printf("%d", n % 2);
}

int main() {
    int x;
    printf("輸入非負整數: ");
    scanf("%d", &x);
    if (x == 0) printf("0");
    else decToBin(x);
    printf("\n");
    return 0;
}

原理: 遞迴先處理高位,回溯時列印低位,自然得到正序二進位。n=0 需特殊處理。

方法二:迭代陣列暫存法

#include <stdio.h>

int main() {
    int x, bits[64] = {0}, idx = 0;
    printf("輸入非負整數: ");
    scanf("%d", &x);

    if (x == 0) { printf("0\n"); return 0; }
    while (x > 0) {
        bits[idx++] = x % 2;
        x /= 2;
    }
    while (idx--) printf("%d", bits[idx]);
    printf("\n");
    return 0;
}

原理: 低位先算存陣列,反序輸出得正序。陣列大小 64 足夠 64 位整數。

進階:位運算優化版

void decToBinBitwise(unsigned int n) {
    if (n == 0) { printf("0"); return; }
    // 找最高位
    int msb = 31 - __builtin_clz(n);  // GCC/Clang 內建函式
    for (int i = msb; i >= 0; i--)
        putchar('0' + ((n >> i) & 1));
}
  • 無除法/模運算,純位移與 AND
  • __builtin_clz 單指令找最高位(前導零計數)
  • 適用無符號整數,負數需轉補碼處理

負數處理:二補數表示

void printInt32Binary(int32_t n) {
    for (int i = 31; i >= 0; i--)
        putchar('0' + ((n >> i) & 1));
}
// 輸入 -1 → 32 個 1;輸入 -5 → 111...1011

效能與選型建議

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法適用場景優點缺點
遞迴教學、位數少代碼極簡函式呼叫開銷、棧深度限制
迭代陣列通用、簽名整數無遞迴、可控制格式需額外陣列
位運算高效能、嵌入式最快、無除法依賴編譯器內建/位數固定