🔢 C++ 数制转换 - L21 进阶概念

掌握二进制、八进制、十进制、十六进制的相互转换

📚 什么是数制?

进位计数制

数制(Number System)是用一组固定的符号和统一的规则来表示数值的方法。不同的数制使用不同的基数。

  • 🔟 十进制(Decimal):基数为10,使用0-9,逢十进一
  • 💻 二进制(Binary):基数为2,使用0和1,逢二进一
  • 🐙 八进制(Octal):基数为8,使用0-7,逢八进一
  • 🔤 十六进制(Hexadecimal):基数为16,使用0-9和A-F,逢十六进一
💡 为什么需要多种进制?
• 人类习惯十进制
• 计算机内部使用二进制(只有开/关两种状态)
• 八进制和十六进制是二进制的简化表示
• 不同进制在不同场景下更方便

各种进制的特点

// 在C++中表示不同进制的数字 int decimal = 255; // 十进制:255 int binary = 0b11111111; // 二进制:0b前缀(C++14) int octal = 0377; // 八进制:0前缀 int hex = 0xFF; // 十六进制:0x前缀 // 输出不同进制 cout << "十进制:" << decimal << endl; // 255 cout << "八进制:" << oct << decimal << endl; // 377 cout << "十六进制:" << hex << decimal << endl; // ff

位权概念

每个数位上的数字代表不同的值,这个值叫做位权

// 十进制 255 的位权分解 // 2 × 10² + 5 × 10¹ + 5 × 10⁰ = 200 + 50 + 5 = 255 // 二进制 11111111 的位权分解 // 1×2⁷ + 1×2⁶ + 1×2⁵ + 1×2⁴ + 1×2³ + 1×2² + 1×2¹ + 1×2⁰ // = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 // 十六进制 FF 的位权分解 // F × 16¹ + F × 16⁰ = 15 × 16 + 15 × 1 = 240 + 15 = 255

⚙️ 进制转换方法

十进制转其他进制

除基取余法:不断除以目标进制的基数,记录余数,直到商为0,然后倒序排列余数。

#include <iostream> #include <string> #include <algorithm> using namespace std; // 十进制转任意进制(2-16) string decimalToBase(int num, int base) { if (num == 0) return "0"; string result = ""; bool negative = false; if (num < 0) { negative = true; num = -num; } while (num > 0) { int remainder = num % base; if (remainder < 10) { result += (char)(remainder + '0'); } else { result += (char)(remainder - 10 + 'A'); } num /= base; } if (negative) result += '-'; reverse(result.begin(), result.end()); return result; } int main() { int num = 255; cout << "十进制 " << num << " 转换为:" << endl; cout << "二进制:" << decimalToBase(num, 2) << endl; // 11111111 cout << "八进制:" << decimalToBase(num, 8) << endl; // 377 cout << "十六进制:" << decimalToBase(num, 16) << endl; // FF return 0; }
💡 转换步骤示例(255转二进制):
255 ÷ 2 = 127 余 1
127 ÷ 2 = 63 余 1
63 ÷ 2 = 31 余 1
31 ÷ 2 = 15 余 1
15 ÷ 2 = 7 余 1
7 ÷ 2 = 3 余 1
3 ÷ 2 = 1 余 1
1 ÷ 2 = 0 余 1
倒序排列:11111111

其他进制转十进制

按权展开法:将每位数字乘以对应的位权,然后求和。

#include <iostream> #include <string> #include <cmath> using namespace std; // 任意进制转十进制 int baseToDecimal(string num, int base) { int result = 0; int power = 0; // 从右到左处理每一位 for (int i = num.length() - 1; i >= 0; i--) { int digit; if (num[i] >= '0' && num[i] <= '9') { digit = num[i] - '0'; } else { digit = toupper(num[i]) - 'A' + 10; } result += digit * pow(base, power); power++; } return result; } int main() { cout << "二进制 11111111 转十进制:" << baseToDecimal("11111111", 2) << endl; // 255 cout << "八进制 377 转十进制:" << baseToDecimal("377", 8) << endl; // 255 cout << "十六进制 FF 转十进制:" << baseToDecimal("FF", 16) << endl; // 255 return 0; }
🎮 互动实验:进制转换器

输入数字和目标进制,实时查看转换结果

点击"转换"查看结果...

🛠️ C++内置进制转换

使用iostream进行进制输出

#include <iostream> using namespace std; int main() { int num = 255; // 默认十进制输出 cout << "十进制:" << num << endl; // 255 // 八进制输出 cout << "八进制:" << oct << num << endl; // 377 // 十六进制输出(小写) cout << "十六进制:" << hex << num << endl; // ff // 十六进制输出(大写) cout << uppercase; cout << "十六进制(大写):" << hex << num << endl; // FF // 恢复十进制 cout << dec; cout << "恢复十进制:" << num << endl; // 255 return 0; }

使用bitset进行二进制转换

#include <iostream> #include <bitset> using namespace std; int main() { int num = 255; // 8位二进制 cout << "8位二进制:" << bitset<8>(num) << endl; // 11111111 // 16位二进制 cout << "16位二进制:" << bitset<16>(num) << endl; // 0000000011111111 // 32位二进制 cout << "32位二进制:" << bitset<32>(num) << endl; // 00000000000000000000000011111111 // 从二进制字符串转换 string binStr = "11111111"; int value = bitset<8>(binStr).to_ulong(); cout << "二进制字符串转十进制:" << value << endl; // 255 return 0; }

快速转换技巧

二进制 ↔ 八进制:每3位二进制对应1位八进制

// 二进制 11111111 转八进制 // 分组:011 111 111(不足3位前面补0) // 转换:3 7 7 // 结果:377 // 八进制 377 转二进制 // 3 → 011, 7 → 111, 7 → 111 // 结果:011111111 → 11111111

二进制 ↔ 十六进制:每4位二进制对应1位十六进制

// 二进制 11111111 转十六进制 // 分组:1111 1111 // 转换:F F // 结果:FF // 十六进制 FF 转二进制 // F → 1111, F → 1111 // 结果:11111111
🎯 进制转换练习

生成随机题目,练习进制转换

点击"生成练习题"开始练习...

🚀 实际应用场景

颜色表示(十六进制)

在Web开发和图形编程中,颜色常用十六进制表示。

#include <iostream> #include <string> using namespace std; // RGB颜色转十六进制 string rgbToHex(int r, int g, int b) { char hexColor[8]; sprintf(hexColor, "#%02X%02X%02X", r, g, b); return string(hexColor); } int main() { // 红色:RGB(255, 0, 0) cout << "红色:" << rgbToHex(255, 0, 0) << endl; // #FF0000 // 绿色:RGB(0, 255, 0) cout << "绿色:" << rgbToHex(0, 255, 0) << endl; // #00FF00 // 蓝色:RGB(0, 0, 255) cout << "蓝色:" << rgbToHex(0, 0, 255) << endl; // #0000FF // 白色:RGB(255, 255, 255) cout << "白色:" << rgbToHex(255, 255, 255) << endl; // #FFFFFF return 0; }

位运算与二进制

#include <iostream> #include <bitset> using namespace std; int main() { int a = 12; // 二进制:1100 int b = 10; // 二进制:1010 cout << "a = " << bitset<8>(a) << " (" << a << ")" << endl; cout << "b = " << bitset<8>(b) << " (" << b << ")" << endl; cout << endl; // 按位与(AND) cout << "a & b = " << bitset<8>(a & b) << " (" << (a & b) << ")" << endl; // 按位或(OR) cout << "a | b = " << bitset<8>(a | b) << " (" << (a | b) << ")" << endl; // 按位异或(XOR) cout << "a ^ b = " << bitset<8>(a ^ b) << " (" << (a ^ b) << ")" << endl; // 左移 cout << "a << 1 = " << bitset<8>(a << 1) << " (" << (a << 1) << ")" << endl; // 右移 cout << "a >> 1 = " << bitset<8>(a >> 1) << " (" << (a >> 1) << ")" << endl; return 0; }

内存地址表示

计算机内存地址通常用十六进制表示,因为更紧凑且易于阅读。

#include <iostream> using namespace std; int main() { int x = 42; // 输出变量的内存地址(十六进制) cout << "变量 x 的值:" << x << endl; cout << "变量 x 的地址:" << &x << endl; // 强制转换为十六进制格式 cout << hex; cout << "地址(十六进制):0x" << (unsigned long)&x << endl; return 0; }

📝 实战练习

📝 理解测试

以下代码的输出是什么?

#include <iostream> using namespace std; int main() { int num = 0xFF; cout << oct << num << endl; return 0; }
选择答案查看解析...
💻 综合挑战

题目:编写一个程序,实现任意进制之间的转换(2-36进制)。

点击"生成代码框架"查看提示...