任意进制(2-36)互相转换

来源:互联网 发布:注册.hk域名 编辑:程序博客网 时间:2024/05/22 14:43

任意进制(2-36)转换, 一种速度较快的方法为使用十进制作为中介.


  1. 转换到10进制
    • n为任意进制数的字符串形式, radix为进制
    • 转换的每一位的范围是:0-9或A-Z
    • 进制转换要从低位开始,乘以其相应进制位的倍数(,radix0,radix1,radix2,radix3).
  2. 转换10进制到任意进制, n为十进制数, radix为转换目标

1.转成二进制
   76 / 2       …  0
 = 38 / 2       …  0
 = 19 / 2       …  1
 =  9 / 2       …  1
 =  4 / 2       …  0
 =  2 / 2       …  0
 =  1 / 2       …  1
 76(10) = 1001100(2)

2.转成八进制
   76 / 8       …  4
 =  9 / 8       …  1
 =  1 / 8       …  1
 76(10) = 114(8)

3.转成十六进制
   76 / 16      …  12
 =  4 / 16      …  4
 76(10)=4C(16)

int to_dec(string n, int radix){    int i, b = 1, sum = 0; //i要做数组a的下标,注意其起止范围     for (i = n.size() - 1; i >= 0; i--) {        if (n[i] >= 'A') {            sum += (n[i] - 'A' + 10) * b;            b *= radix;        }        else {            sum += (n[i] - '0') * b;            b *= radix;        }    }    return sum;}string dec_to(int n, int radix){    // 这种方法不适用于0, 所以需要特殊处理    if (n == 0) return "0";    vector<int> vec;    while (n != 0) {        vec.push_back(n%radix);        n /= radix;    }    string result;    for (int i = vec.size() - 1; i >= 0; i--) {        result += temp[vec[i]];    }    return result;}

所以互相转换只需要调用两个函数就可以, 如15进制的A 转换到8进制: dec_to(to_dec("A", 15), 8).

封装一下

string convert_radix(string n, int from, int to) {    return dec_to(to_dec(n, from), to);}

如15进制的A 转换到8进制: convert_radix("A", 15, 8)

0 0
原创粉丝点击