#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));
}
__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
| 方法 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| 遞迴 | 教學、位數少 | 代碼極簡 | 函式呼叫開銷、棧深度限制 |
| 迭代陣列 | 通用、簽名整數 | 無遞迴、可控制格式 | 需額外陣列 |
| 位運算 | 高效能、嵌入式 | 最快、無除法 | 依賴編譯器內建/位數固定 |