十六进制字符转十进制算法

[复制链接]
发表于 2025-7-27 08:27:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
十六进制与十进制对照

十六进制十进制
00
11
22
33
44
55
66
77
88
99
A10
B11
C12
D13
E14
F15
十六进制与十进制区别

十六进制是满16进1,十进制是满10进1,这里要注意下区别,16进制的字符里面为什么是0-9没有10,这里面进了一位,表示16了。
十六进制转十进制的算法逻辑

处理转换过程分为正序和逆序
正序

从左到右加权累加,每次往右加一个数的时候,原来的数字必要向左变高位移动一位,就是乘以16。比如有一个“1A3”,result记载十进制累加值初始为0,
我们遍历第一次,是1进来:
result=result*16+1=0*16+1=1
第二次,A进来==10,1左移一位:
result=result*16+10=1*16+10=26
第三次,3进来,1A左移一位:
result=result*16+3=26*16+3=419
整体公式其实就是:
result=1*16^2+A*16^1+3*16^0
实现
  1. int hexToDecimalManual(const std::string& hexStr) {
  2.     int result = 0;
  3.     size_t startIdx = (hexStr.substr(0, 2) == "0x" || hexStr.substr(0, 2) == "0X") ? 2 : 0;
  4.    
  5.     for (size_t i = startIdx; i < hexStr.size(); ++i) {
  6.         char c = hexStr[i];
  7.         int value;
  8.         if (isdigit(c)) {
  9.             value = c - '0';
  10.         } else if (c >= 'A' && c <= 'F') {
  11.             value = 10 + c - 'A';
  12.         } else if (c >= 'a' && c <= 'f') {
  13.             value = 10 + c - 'a';
  14.         } else {
  15.             break; // 非法字符终止转换
  16.         }
  17.         result = result * 16 + value; // 逆序权值累加
  18.     }
  19.     return result;
  20. }
复制代码
逆序

逆序是从右到左遍历字符串,有一个base记载处理的权值,每次引入的字符都是更高位的字符,必要做一个权值处理,实现起来和正序差不多,注意方向就行
实现
  1. long long hexToDecimal_Reverse(const string& hex) {
  2.     long long result = 0;
  3.     long long base = 1; // 初始权值为16^0=1
  4.     for (int i = hex.length() - 1; i >= 0; i--) {
  5.         char c = hex[i];
  6.         int val;
  7.         if (c >= '0' && c <= '9') {
  8.             val = c - '0';
  9.         } else if (c >= 'A' && c <= 'F') {
  10.             val = 10 + c - 'A';
  11.         } else if (c >= 'a' && c <= 'f') {
  12.             val = 10 + c - 'a';
  13.         } else {
  14.             throw invalid_argument("非法十六进制字符");
  15.         }
  16.         // 动态调整权值
  17.         result += val * base;
  18.         base *= 16; // 权值左移(如1→16→256)
  19.     }
  20.     return result;
  21. }
  22. // 示例输入:hex = "1A3" → 输出419
复制代码
不建议使用math库的pow,复杂度高了
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表