十进制系统:采用10ⁿ位权体系,每个数字的位置代表不同的权重。例如数字"365"表示为:3×10² + 6×10¹ + 5×10⁰ = 300 + 60 + 5 = 365
通用r进制系统:遵循rⁿ位权表达方式。对于r进制数"dₙdₙ₋₁...d₁d₀",其十进制值为:∑dᵢ×rⁱ (i=0到n)。例如:
进制类型 | 基数(r) | 数字符号 | 典型应用场景 |
---|---|---|---|
二进制 | 2 | 0-1 | 计算机底层硬件 |
八进制 | 8 | 0-7 | Unix文件权限 |
十进制 | 10 | 0-9 | 日常计算 |
十六进制 | 16 | 0-9,A-F | 内存地址、颜色编码 |
特殊进制示例:
除基取余法证明: 对于任意整数N和基数t,存在唯一表示:N = aₙtⁿ + aₙ₋₁tⁿ⁻¹ + ... + a₁t¹ + a₀t⁰ 通过连续除以t取余数,恰好得到系数序列a₀到aₙ
余数范围: 余数严格满足0 ≤ remainder < t。对于大于10的进制:
string f(int x, int t){
string s; // 初始化空字符串存储结果
while(x){ // 循环直到商归零
int remainder = x%t; // 取当前最低位数字
// 处理10以上进制的字母表示
s += (remainder>=10) ?
(remainder-10+'A') : // A(65)对应10,B(66)对应11...
(remainder+'0'); // 直接转换为ASCII数字
x /= t; // 相当于右移一位(去掉已处理的低位)
}
reverse(s.begin(), s.end()); // 反转余数序列得到正确顺序
return s;
}
余数计算:
x%t
获取当前最低位的数字值字符映射技巧:
反转必要性: 由于算法先得到最低位,最后得到最高位,必须反转才能获得正确顺序。例如:
零值处理:
if(x == 0) return "0"; // 必须在循环前检查
负整数处理:
if(x < 0) {
sign = -1;
x = -x; // 转为正数处理
}
// 转换完成后添加负号
大整数溢出:
有效进制范围:
if(t < 2 || t > 36)
throw invalid_argument("Base must be 2-36");
非法输入处理:
预分配空间:
string s;
s.reserve(32); // 预先分配足够空间避免多次扩容
位运算优化(针对2的幂次进制):
// 二进制转换优化示例
while(x){
s += (x & 1) ? '1' : '0';
x >>= 1;
}
string convert(int n, int base) {
if (n < base)
return (n < 10) ? to_string(n) : string(1, 'A' + n - 10);
return convert(n/base, base) +
((n%base < 10) ? to_string(n%base) : string(1, 'A' + n%base - 10));
}
递归优缺点:
处理小数部分:乘基取整法
double fractional = n - floor(n);
while(fractional > 1e-6){
fractional *= base;
int digit = floor(fractional);
s += (digit < 10) ? '0'+digit : 'A'+digit-10;
fractional -= digit;
}
内存地址表示:
颜色编码:
Base64编码:
哈希值表示:
快速幂法: 从最高位开始确定权重:
int weight = 1;
while(weight <= x/t) weight *= t;
while(weight){
int digit = x / weight;
// ...转换digit...
x %= weight;
weight /= t;
}
查表法: 预先计算并存储转换结果,适用于频繁转换相同数值的场景
Python实现:
def convert(n, base):
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
return digits[n] if n < base else convert(n//base, base) + digits[n%base]
Java实现:
Integer.toString(255, 16); // 直接返回"FF"
#include
#include
using namespace std;
string baseConvert(int x, int t) {
if(t < 2 || t > 36) return "Invalid base";
if(x == 0) return "0";
string s;
bool negative = x < 0;
x = abs(x);
while(x > 0) {
int r = x % t;
s += (r < 10) ? '0'+r : 'A'+r-10;
x /= t;
}
if(negative) s += '-';
reverse(s.begin(), s.end());
return s;
}
int main() {
cout << baseConvert(255, 16) << endl; // FF
cout << baseConvert(1023, 2) << endl; // 1111111111
return 0;
}