一、进制转换要明白的基础知识。。。

1、什么是进制? 进制也就是进位计数制,是人为定义的带进位的计数方法。对于任何一种进制 X 进制,就表示每一位置上的数运算时都是逢 X 进一位。十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x 进制就是逢 x 进位。

2、生活中常见的进制有哪些? 10 进制、60 进制、12 进制、24 进制等;

3、n 进制如何数数?

10 进制:0 1 2 3 4 5 6 7 8 9 10 11……

  2 进制:0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000……

  8 进制:0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21……

16 进制:0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E  ……

4、常见进制的表示与区分 0b\0o\0x

int a = 0b10101;    // 二进制数字,10101(等于十进制的21)
int b = 0o123456;   // 八进制数字,123456(等于十进制的42798)
int c = 0x123456A;  // 十六进制数字,123456A(等于十进制的19088746)


 二、图示更清楚吧。。。

下面的图示以及后面的代码包含了所有进制转换的规律和方法,是我现在所学会的方法的一个总结整理,后面如果学会了其他更简洁方便的方法还要补充上的。。。

三、代码分析与讲解。。。

1. R-->10 按权展开

//2--10 十入按权展 
int to_D(){string s;//接收R进制字符 cin>>s;//getline(cin,s);int R,Q=1;//起始进制数 和 权重 cin>>R;int re=0;//10进制数字 reverse(s.begin(),s.end());for(char c:s){if(c>='A') re+=(c-'A'+10)*Q;//可能是16进制的字符 else re+=(c-'0')*Q;Q=Q*R; }return re; 
}

简单方法:

后面发现有一个函数可以把【任意进制的字符串】转为【十进制整数】,一行抵十几行。。。

long long d=stoll(s, nullptr, base);  //base是任意进制 ,还有 stoi()\stof()


 2. 10-->R 短除取倒余

//10--2 十出短除倒余 
string D_to(){int n;//大数用ll cin>>n;//接收10进制数字 int R;//目标进制cin>>R;string re;//R进制结果 while(n){int x = n%R;char c = (x >= 10) ? (x - 10 +'A') : (x+'0');re = c + re;n = n/R;}return (re.empty())? "0":re;
}

简单方法:

后面也发现了一个函数10——>8/16的,3行抵十几行...

stringstream ss;
ss << hex << d;  // 十进制d → 十六进制字符串hex(不带 0x)—>ss

cout << ss.str() << endl;  // 输出:1a3(小写)可用 uppercase 控制输出为大写

10——>2:

cout << bitset<8>(d) << endl;  // 输出:00001101(只能是8/16),不可逆的转换


3.  R-->2 映射后拼接去0

// 16--2 二入映射后拼接 (补/删前导0)
string to_B(){string s;//接收R进制字符 cin>>s;//getline(cin,s);int Q=1,R;//权重和起始进制数 string re;//二进制unordered_map<char,string> RTB16= //16进制映射表 {	{'0', "0000"}, {'1', "0001"}, {'2', "0010"}, {'3', "0011"},{'4', "0100"}, {'5', "0101"}, {'6', "0110"}, {'7', "0111"},{'8', "1000"}, {'9', "1001"}, {'A', "1010"}, {'B', "1011"},{'C', "1100"}, {'D', "1101"}, {'E', "1110"}, {'F', "1111"}}; 
//  vector<string> RTB8= //8进制映射表 
//	{"000","001","010","011",
//	 "100","101","110","111"
//	};//其余的按照规律写映射 for(char c:s) {re+=RTB16[c];
//    	re+=RTB8[c-'0'];//8进制 }while(re.size()>0&&re[0]=='0')//删除前导0 方法1 直接删除 re.erase(0,1);//	int i;
//	for(i=0;i<re.size()&&re[i]=='0';i++);//删除前导0 方法2 定位获得子串 
//	re=re.substr(i);return re;
}

4. 2-->R 补0三四展去0

//2--16 二出补0三四展(补/删前导0)
string B_to(){string s;//接收二进制字符 cin>>s;//getline(cin,s);int Q=1,R;//目标进制数 string re;//R进制int cnt8=(3-s.size()%3)%3;//转成八进制的补0个数 
//	int cnt16=(4-s.size()%4)%4;//转成十六进制的补0个数 s=string(cnt8,'0')+s;for(int i=0;i<s.size();i+=3) //或者是 i+=4 {int x=(s[i]-'0')*4 + (s[i+1]-'0')*2 + (s[i+2]-'0')*1;char c = (x >= 10) ? (x - 10 +'A') : (x+'0');re+=c;}int i;for(i=0;i<re.size()&&re[i]=='0';i++);//删除前导0 方法2 re=re.substr(i);return re;
}

 5. 8--10--16 按权展+短除取倒余

//8--10--16,短数 转10按权用短除 
string R_D_R(){string s;//接收R1进制字符 cin>>s;//getline(cin,s);int Q=1,R1=8;//权重和起始进制数 int re=0;//10进制数字 
//【按权】	reverse(s.begin(),s.end());for(char c:s){if(c>='A') re+=(c-'A'+10)*Q;//可能是16进制的字符 else re+=(c-'0')*Q;Q=Q*R1; }
//	cout<<re<<endl;//10进制数 int n=re; int R2=16;//目标进制string r;//R2进制结果 
//【短除】	while(n){int x=n%R2;char c = (x >= 10) ? (x - 10 +'A') : (x+'0');r = c+r;n=n/R2;}return (r.empty())? "0":r;
}

6. 16--2--8 映射拼接去0+补0展开

//16--2--8 ,长数 转2映射补0展 
string R_B_R() { 
//【映射】 vector<string> h_b = {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};string h, b, o;//16\2\8 cin >> h;for(char c : h) { // 16 -> 2if (c >= 'A') b += h_b[c - 'A' + 10];else b += h_b[c - '0'];}// 去掉前导0while(b.size() > 0 && b[0] == '0') {b.erase(0, 1);}
//【补0】 int cnt = (3 - b.size() % 3) % 3;b = string(cnt, '0') + b;
//【展】 for (int i = 0; i < b.size(); i += 3) { // 2 -> 8int x = (b[i] - '0') * 4 + (b[i+1] - '0') * 2 + (b[i+2] - '0');o += x + '0';}// 去掉前导0while (o.size() > 0 && o[0] == '0') {o.erase(0, 1);}return o;
}

可以看出来,在涉及到2进制转换的时候,都要进行去除前导0的操作,因此可以用一个封装函数实现去除字符串的前导0。。。

删除前导0函数

//删除前导0的函数
string remove0(string s) {size_t pos = s.find_first_not_of('0');//找到第一个不是0的位置 return (pos != string::npos) ? s.substr(pos) : "0";
}//在去除前导0时调用remove0()函数
re=remove0(re);


四、任意进制转换函数(S)M-->(?)N

输入:

M N(int)

S(string)

输出:

?(string)

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;// 将M进制字符串S转为十进制整数d
long long to_D(const string& s, int M) {long long d = 0;long long Q = 1;//权重 for (int i = s.size() - 1; i >= 0; --i) {char c = toupper(s[i]);int x = (c >= 'A')?  (c - 'A' + 10 ):  (c - '0');d += x * Q;Q =Q * M;}return d;
}// 将十进制整数d转为N进制字符串
string D_to(long long d, int N) {if (d == 0) return "0";string re;while (d > 0) {int x = d % N;char c = (x >= 10) ? (x - 10 + 'A') : (x + '0');re = c + re;d /= N;}return re;
}int main() {//(S)M-->(?)Nint M, N;//两个进制数字 string S;//M进制的数字 cin >> M >> N >> S;long long d = to_D(S, M);         // M → 10string re = D_to(d, N);     // 10 → Ncout << re << endl;return 0;
}

总结:以上实现了各类进制的转换,涉及到一般数据范围和超大数据范围的数据处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88669.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88669.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88669.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zephyr OS蓝牙广播(Advertising)功能实现

目录 概述 1 Advertising功能介绍 1.1 实现原理 1.2 广播类型 1.3 广播数据格式 1.4 优化建议 1.5 常见问题和解决方法 2 Nordic 蓝牙广播&#xff08;Advertising&#xff09;功能实现 2.1 环境准备与SDK基础 2.2 广播功能实现 2.3 广播优化与最佳实践 3 实际应用案例…

服务器不支持PUT,DELETE 的解决方案

nginx 的更改&#xff1a; set $method $request_method; if ($http_X_HTTP_Method_Override ~* PUT|DELETE) { set $method $http_X_HTTP_Method_Override; } proxy_method $method; axios 的更改&#xff1a; const method config.me…

从0开始学习计算机视觉--Day04--线性分类

从宏观来看&#xff0c;卷积网络可以看做是由一个个不同的神经网络组件组合而成&#xff0c;就像积木一样通过不同类型的组件搭建形成&#xff0c;其中线性分类器是一个很重要的组件&#xff0c;在很多卷积网络中都有用到&#xff0c;所以了解清楚它的工作原理对我们后续的学习…

基于ComfyUI与Wan2.1模型的本地化视频生成环境搭建指南

文章目录 前言1.软件准备1.1 ComfyUI1.2 文本编码器1.3 VAE1.4 视频生成模型2.整合配置3. 本地运行测试4. 公网使用Wan2.1模型生成视频4.1 创建远程连接公网地址5. 固定远程访问公网地址总结前言 各位小伙伴们,今天我们将为您展示一套创新的人工智能应用方案!本次教程将指导…

Vue 2 项目中内嵌 md 文件

推荐方案&#xff1a;raw-loader marked 解析 Markdown 第一步&#xff1a;安装依赖 npm install marked --save npm install raw-loader --save-dev第二步&#xff1a;配置 webpack 支持 .md 文件 打开 vue.config.js 或 webpack.config.js&#xff0c;添加以下配置&#…

Spring AI初识及简单使用,快速上手。

Spring AI简介 在当今这样一个快速发展的技术时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为各行各业的一种标配。而作为一款主流的Java应用开发框架Spring&#xff0c;肯定会紧跟时代的潮流&#xff0c;所以&#xff0c;推出了Spring AI框架。 官网描述&#…

Flask中的render_template与make_response:生动解析与深度对比

文章目录 Flask中的render_template与make_response&#xff1a;生动解析与深度对比一、&#x1f31f; 核心概念速览二、&#xfffd; render_template - 网页内容的主厨特点与内部机制适用场景高级用法示例 三、&#x1f381; make_response - 响应的包装专家核心功能解析适用…

WordPress目录说明

在WordPress建站过程中&#xff0c;理解服务器目录结构是非常重要的。以下是一个基础的WordPress服务器目录指南&#xff1a; /wp-admin/ &#xff1a;这个目录包含了WordPress网站的所有管理功能&#xff0c;包括用于处理网站后台的所有PHP文件。 /wp-includes/ &#xff1a;…

HTTP面试题——缓存技术

目录 HTTP缓存技术有哪些&#xff1f; 什么是强制缓存&#xff1f; 什么是协商缓存&#xff1f; HTTP缓存技术有哪些&#xff1f; 对于一些具有重复性的HTTP请求&#xff0c;比如每次请求得到的数据都是一样的&#xff0c;我们可以把这对 请求-响应的数据都缓存在本地&#x…

virtual box 不能分配 USB设备 IFX DAS JDS TriBoard TC2X5 V2.0 [0700] 到虚拟电脑 win10

VirtualBox: Failed to attach the USB device to the virtual machine – Bytefreaks.net ISSUE&#xff1a; virtual box 不能分配 USB设备 IFX DAS JDS TriBoard TC2X5 V2.0 [0700] 到虚拟电脑 win10. USB device IFX DAS JDS TriBoard TC2X5 V2.0 with UUID {91680aeb-e1…

Deepoc大模型重构核工业智能基座:混合增强架构与安全增强决策技术​

面向复杂系统的高可靠AI赋能体系构建 Deepoc大模型通过多维度技术突破&#xff0c;显著提升核工业知识处理与决策可靠性。经核能行业验证&#xff0c;其生成内容可验证性提升68%&#xff0c;关键参数失真率<0.3%&#xff0c;形成覆盖核能全链条的定制化方案&#xff0c;使企…

第12章:冰箱里的CT扫描仪——计算机视觉如何洞穿食材的“生命密码“

第11章:冰箱里的CT扫描仪——计算机视觉如何成为食材健康的"超级诊断官" “糟了!冰箱里草莓长出了白色绒毛,鸡胸肉渗出了可疑的粉红色液体!” 这揭示了厨房生存的更基本挑战:如何像经验丰富的主厨一样,一眼洞穿食材的健康密码? 本章将揭示计算机视觉技术如何赋…

虚幻基础:窗口——重定向

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 重定向&#xff1a;给骨架添加兼容骨架。使得不同模型间复用动画资源 重定向&#xff1a;给骨架添加兼容骨架。使得不同模型间复用动画资源

CSS 逐帧动画

CSS 逐帧动画实现指南 逐帧动画(frame-by-frame animation)是一种通过快速连续显示一系列静态图像来创造运动效果的技术。以下是使用CSS实现逐帧动画的几种方法。 1. 使用 steps() 计时函数 这是实现逐帧动画最常用的方法&#xff0c;通过animation-timing-function的steps(…

高版本IDEA如何开发低版本jdk项目

问题描述 我这个人比较喜欢新的东西&#xff0c;比如使用idea的时候&#xff0c;我就喜欢最新版本。 但是有个问题&#xff0c;最新版本的idea好像不支持jdk1.6&#xff0c;导致我无法去用新版本idea开发项目。 直到有一天&#xff0c;idea给了我一个提示如下&#xff0c;之…

Java设计模式->责任链模式的介绍

目录 1、责任链模式概念 1.1、定义介绍 1.2、流程图 1.3、优缺点 2、实现 3、应用场景 3.1、Springmvc流程 3.2、mybatis的执行流程 3.3、Spring的过滤器和拦截器 3.4、sentinel限流熔断 3.5、aop的加载和使用 4、举例 前言 是一种 行为型设计模式&#xff0c;它通…

【Bluedroid】蓝牙启动之 btm_acl_device_down 流程源码解析

本文详细分析Android蓝牙协议栈在设备故障时的处理流程。当蓝牙设备发生硬件故障或系统异常时,协议栈通过btm_acl_device_down触发多层次的资源清理和状态重置,包括ACL连接终止、L2CAP通道释放、SCO连接清理、BLE拓扑更新、设备数据库重置等关键操作,确保系统安全恢复。 一、…

随记:WebMvcConfigurationSupport 和WebMvcConfigurer 的区别

WebMvcConfigurationSupport &#xff08;抽象类&#xff09; 他是一个完整的 MVC 配置基类&#xff0c;他会禁用所有自动配置。默认静态资源映射也没有了。默认消息转换器&#xff08;json、xml&#xff09;也没有了。错误处理页默认的error也没有了。 WebMvcConfigurer &am…

npm run dev报错

1. 引言 1.1 什么是npm run dev npm run dev 是一个在 Node.js 项目中常用的命令&#xff0c;它允许开发者运行一个预定义的脚本&#xff0c;通常用于启动开发服务器或者执行开发环境的构建任务。这个命令是通过 package.json 文件中的 scripts 部分定义的&#xff0c;例如&…

Kotlin环境搭建与基础语法入门

目标&#xff1a;完成开发环境配置&#xff0c;编写第一个Kotlin程序&#xff0c;理解变量、数据类型和基本输出。 1. 环境搭建 步骤1&#xff1a;安装JDK 下载并安装 JDK 17&#xff08;Kotlin兼容性最佳版本&#xff09;。 配置环境变量 JAVA_HOME&#xff0c;并在终端验证…