📚 什么是数制?
进位计数制
数制(Number System)是用一组固定的符号和统一的规则来表示数值的方法。不同的数制使用不同的基数。
- 🔟 十进制(Decimal):基数为10,使用0-9,逢十进一
- 💻 二进制(Binary):基数为2,使用0和1,逢二进一
- 🐙 八进制(Octal):基数为8,使用0-7,逢八进一
- 🔤 十六进制(Hexadecimal):基数为16,使用0-9和A-F,逢十六进一
💡 为什么需要多种进制?
• 人类习惯十进制
• 计算机内部使用二进制(只有开/关两种状态)
• 八进制和十六进制是二进制的简化表示
• 不同进制在不同场景下更方便
各种进制的特点
int decimal = 255;
int binary = 0b11111111;
int octal = 0377;
int hex = 0xFF;
cout << "十进制:" << decimal << endl;
cout << "八进制:" << oct << decimal << endl;
cout << "十六进制:" << hex << decimal << endl;
位权概念
每个数位上的数字代表不同的值,这个值叫做位权。
⚙️ 进制转换方法
十进制转其他进制
除基取余法:不断除以目标进制的基数,记录余数,直到商为0,然后倒序排列余数。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
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;
cout << "八进制:" << decimalToBase(num, 8) << endl;
cout << "十六进制:" << decimalToBase(num, 16) << endl;
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;
cout << "八进制 377 转十进制:"
<< baseToDecimal("377", 8) << endl;
cout << "十六进制 FF 转十进制:"
<< baseToDecimal("FF", 16) << endl;
return 0;
}
🎮 互动实验:进制转换器
输入数字和目标进制,实时查看转换结果
点击"转换"查看结果...
🛠️ C++内置进制转换
使用iostream进行进制输出
#include <iostream>
using namespace std;
int main() {
int num = 255;
cout << "十进制:" << num << endl;
cout << "八进制:" << oct << num << endl;
cout << "十六进制:" << hex << num << endl;
cout << uppercase;
cout << "十六进制(大写):" << hex << num << endl;
cout << dec;
cout << "恢复十进制:" << num << endl;
return 0;
}
使用bitset进行二进制转换
#include <iostream>
#include <bitset>
using namespace std;
int main() {
int num = 255;
cout << "8位二进制:" << bitset<8>(num) << endl;
cout << "16位二进制:" << bitset<16>(num) << endl;
cout << "32位二进制:" << bitset<32>(num) << endl;
string binStr = "11111111";
int value = bitset<8>(binStr).to_ulong();
cout << "二进制字符串转十进制:" << value << endl;
return 0;
}
快速转换技巧
二进制 ↔ 八进制:每3位二进制对应1位八进制
二进制 ↔ 十六进制:每4位二进制对应1位十六进制
🎯 进制转换练习
生成随机题目,练习进制转换
点击"生成练习题"开始练习...
🚀 实际应用场景
颜色表示(十六进制)
在Web开发和图形编程中,颜色常用十六进制表示。
#include <iostream>
#include <string>
using namespace std;
string rgbToHex(int r, int g, int b) {
char hexColor[8];
sprintf(hexColor, "#%02X%02X%02X", r, g, b);
return string(hexColor);
}
int main() {
cout << "红色:" << rgbToHex(255, 0, 0) << endl;
cout << "绿色:" << rgbToHex(0, 255, 0) << endl;
cout << "蓝色:" << rgbToHex(0, 0, 255) << endl;
cout << "白色:" << rgbToHex(255, 255, 255) << endl;
return 0;
}
位运算与二进制
#include <iostream>
#include <bitset>
using namespace std;
int main() {
int a = 12;
int b = 10;
cout << "a = " << bitset<8>(a) << " (" << a << ")" << endl;
cout << "b = " << bitset<8>(b) << " (" << b << ")" << endl;
cout << endl;
cout << "a & b = " << bitset<8>(a & b) << " (" << (a & b) << ")" << endl;
cout << "a | b = " << bitset<8>(a | b) << " (" << (a | b) << ")" << endl;
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进制)。
点击"生成代码框架"查看提示...