十進制轉二進制是計算機基礎教學中的經典問題,也是理解位運算與數組操作的絕佳切入點。本文提供兩種實現方案:基於除2取餘的數組存儲法,以及更高效的位運算直接輸出法。
0) {
binary[index++] = unum % 2;
unum /= 2;
}
// 輸出結果(高位在前)
printf("%d 的二進制表示為: ", original);
for (int i = index - 1; i >= 0; i--) {
printf("%d", binary[i]);
// 每4位加空格增強可讀性
if (i % 4 == 0 && i > 0) printf(" ");
}
printf("\n");
return 0;
}
關鍵點解析:
unsigned int處理負數,自動獲取補碼表示= 0; i--) {
int bit = (unum >> i) & 1;
if (bit) leadingZero = 0;
if (!leadingZero || i == 0) {
printf("%d", bit);
if (i % 4 == 0 && i > 0) printf(" ");
}
}
printf("\n");
}
優勢:無需額外數組,O(1)空間複雜度,直接通過移位和位與操作提取每一位。
0) {
result[idx++] = digits[num % base];
num /= base;
}
// 逆序輸出
for (int i = idx - 1; i >= 0; i--) {
putchar(result[i]);
}
putchar('\n');
}
輸出示例:
輸入: 0 二進制: 0 輸入: 1 二進制: 1 輸入: 5 二進制: 101 輸入: 10 二進制: 1010 輸入: 255 二進制: 1111 1111 輸入: -1 二進制: 1111 1111 1111 1111 1111 1111 1111 1111 輸入: -10 二進制: 1111 1111 1111 1111 1111 1111 1111 0110 輸入: 2147483647 二進制: 111 1111 1111 1111 1111 1111 1111 1111 輸入: -2147483648 二進制: 1000 0000 0000 0000 0000 0000 0000 0000常見錯誤與優化建議
- 忽略負數處理:直接對有符號數右移會進行算術右移(符號位擴展),必須轉為無符號數
- 前導零處理:教學代碼可輸出全32位,實用工具建議跳過前導零
- 可讀性增強:每4/8位插入空格或分隔符,對應十六進制/字節邊界
- 邊界測試:必須測試0、1、最大值、最小值、負數等邊界情況
位運算核心技巧總結
| 操作 | 代碼 | 說明 |
|---|---|---|
| 提取第i位 | (num >> i) & 1 | 右移i位後與1位與 |
| 設置第i位為1 | num |= (1 << i) | 或運算設置位 |
| 清除第i位為0 | num &= ~(1 << i) | 與運算清除位 |
| 翻轉第i位 | num ^= (1 << i) | 異或運算翻轉位 |
掌握十進制轉二進制不僅是完成作業要求,更是建立位運算直覺的關鍵一步。建議在調試嵌入式寄存器、網絡協議解析、加密算法實現等場景中靈活運用位運算技巧。