当前位置: 首页 > article >正文

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

十六进制与十进制对照

十六进制十进制
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

实现

int hexToDecimalManual(const std::string& hexStr) {int result = 0;size_t startIdx = (hexStr.substr(0, 2) == "0x" || hexStr.substr(0, 2) == "0X") ? 2 : 0;for (size_t i = startIdx; i < hexStr.size(); ++i) {char c = hexStr[i];int value;if (isdigit(c)) {value = c - '0';} else if (c >= 'A' && c <= 'F') {value = 10 + c - 'A';} else if (c >= 'a' && c <= 'f') {value = 10 + c - 'a';} else {break; // 非法字符终止转换}result = result * 16 + value; // 逆序权值累加}return result;
}

逆序

逆序是从右到左遍历字符串,有一个base记录处理的权值,每次引入的字符都是更高位的字符,需要做一个权值处理,实现起来和正序差不多,注意方向就行

实现

long long hexToDecimal_Reverse(const string& hex) {long long result = 0;long long base = 1; // 初始权值为16^0=1for (int i = hex.length() - 1; i >= 0; i--) {char c = hex[i];int val;if (c >= '0' && c <= '9') {val = c - '0';} else if (c >= 'A' && c <= 'F') {val = 10 + c - 'A';} else if (c >= 'a' && c <= 'f') {val = 10 + c - 'a';} else {throw invalid_argument("非法十六进制字符");}// 动态调整权值result += val * base;base *= 16; // 权值左移(如1→16→256)}return result;
}// 示例输入:hex = "1A3" → 输出419

不建议使用math库的pow,复杂度高了

http://www.lryc.cn/news/2387134.html

相关文章:

  • 跟Gemini学做PPT:汇报背景图寻找指南
  • java交易所,多语言,外汇,黄金,区块链,dapp类型的,支持授权,划转,挖矿(源码下载)
  • (已开源-CVPR2024) RadarDistill---NuScenes数据集Radar检测第一名
  • 【MySQL】 数据库基础数据类型
  • 中小企业AI算力如何选?【显卡租赁】VS【自建服务器】
  • OpenHarmony 4.1版本应用升级到5.0版本问题记录及解决方案
  • std::initialzer_list 与花括号{}数据列表
  • 萤石云实际视频实时接入(生产环境)
  • QT中常用的类
  • Docker系列(四):容器操作全栈技术指南 --- 从入门到生产级管控
  • poppler_path 是用于 Python 库如 pdf2image 进行 PDF 转换时
  • 鸿蒙OSUniApp 开发的多图浏览器组件#三方框架 #Uniapp
  • MongoDB 错误处理与调试完全指南:从入门到精通
  • React从基础入门到高级实战:React 核心技术 - 表单处理与验证深度指南
  • 【C++】stack,queue和priority_queue(优先级队列)
  • ubuntu中上传项目至GitHub仓库教程
  • [Java实战]Spring Boot整合达梦数据库连接池配置(三十四)
  • windows 下用yolov5 训练模型 给到opencv 使用
  • Spark集群架构解析:核心组件与Standalone、YARN模式深度对比(AM,Container,Driver,Executor)
  • Linux Kernel调试:强大的printk(二)
  • Kafka Kraft模式集群 + ssl
  • [crxjs]自己创建一个浏览器插件
  • 类的设计模式——单例、工厂以及建造者模式
  • STM32之看门狗(IWDG)
  • PyTorch实现MLP信用评分模型全流程
  • 语音识别——文本转语音
  • 跟着华为去变革 ——读《常变与长青》有感
  • 图像分割技术的实现与比较分析
  • node.js配置变量
  • Ubuntu+Docker+内网穿透:保姆级教程实现安卓开发环境远程部署