常见进制转换

news/2025/1/3 8:13:29/

常见进制转换

一. 进制概述

进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。 对于任何一种进制——X进制,就表示每一位置上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

1.二进制

二进制有两个特点:它由两个数码0,1组成,二进制数运算规律是逢二进一,借位规则是“借一当二”。
例如:1+1=10B,10-1=1B

2. 八进制

八进制的基数R=8=2^3,有数码0、1、2、3、4、5、6、7,并且每个数码正好对应三位二进制数,所以八进制能很好地反映二进制。八进制用下标8或数据后面加O表示 例如:二进制数据 ( 11 101 010 . 010 110 100 )2 对应八进制数据 (352.264)8或352.264O。

3.十进制

十进制的基数为10,数码由0-9组成,计数规律逢十进一。

4.十六进制

十六进制数有两个基本特点:它由十六个数码:数字0~9加上字母A-F组成(它们分别表示十进制数10~15),十六进制数运算规律是逢十六进一,即基数R=16=2^4,通常在表示时用尾部标志H或下标16以示区别。
例如:十六进制数4AC8可写成(4AC8)16,或写成4AC8H。

二. 进制转换

1.十进制整数转二进制整数

十进制整数转换成二进制的方法之一——取余法
在这里插入图片描述
因为余数要逆序排列,所以45D = 10 1101B
代码如下:

#include<bits/stdc++.h>
using namespace std;
char B[20]; // 保存二进制
int main() {int D; // 十进制cin >> D;for(int i = 0; ; i++) {B[i] = D%2+'0';   // 取D的余数加上'0',将余数转换成ASCLL码 D /= 2;   // D整数2 if(D==0)break;}for(int i = strlen(B)-1; i >= 0; i--)  // 因为所得到的余数要逆着写 cout << B[i];    	//所以B[i]逆着输出cout << endl;return 0;
}

2.二进制整数转换十进制整数

把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。
2的0次方是1(任何数的0次方都是1,0的0次方无意义)
2的1次方是2
2的2次方是4
2的3次方是8
2的4次方是16
2的5次方是32
2的6次方是64
2的7次方是128
等等
例如:
100011B=32+0+0+0+2+1=35D
代码如下:

#include<bits/stdc++.h>
using namespace std;
char B[20]; // 保存二进制
int main(){cin >> B;  // 输入二进制数列 int len = strlen(B); // 二进制数列长度int D=0;int q = 0; // 权值 for(int i = len-1; i >= 0; i--){D = D+(B[i]-'0')*pow(2,q++);  } cout << D << endl;return 0;
} 

3.十进制整数转八进制整数

十进制转 八进制和十进制转二进制的方法是一样的,区别之一就是需要判断十进制是否大于等于0小于等于8,大于8则取余。
在这里插入图片描述
因为余数要逆序排列,所以45D=55O
代码如下:

#include<bits/stdc++.h>
using namespace std;
char O[100];
int main() {int D;  // 十进制cin >> D;for(int i = 0; ; i++) {if(D>9)O[i] = D%8+'0';elseO[i] = D+'0';D /= 8;if(D==0)break;}for(int i = strlen(O)-1; i >= 0; i--)cout << O[i];cout << endl;return 0;
}

4. 八进制整数转十进制

八进制转十进制的方法与二进制的方法相似,把八进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。
8的0次方是1(任何数的0次方都是1,0的0次方无意义)
8的1次方是8
8的2次方是16
8的3次方是128
8的4次方是1024
例如:55O = 5 * 8^1 + 5 * 8^0 = 45D

#include<bits/stdc++.h>
using namespace std;
char O[100];
int main() {cin >> O;int len = strlen(O);int D=0;int q = 0; // 权值for(int i = len-1; i >= 0; i--) { //按权相加D = D+(O[i]-'0')*pow(8,q++);}cout << D << endl;return 0;
}     

5.十进制整数转换十六进制

(1)循环取余,再整除
(2)小于10的十进制数,按十进制输出
(3)大于9小于16的十进制,按对应的A~F输出
在这里插入图片描述
55D = 37H
代码如下:

#include<bits/stdc++.h>
using namespace std;
int main() {int D; //十进制cin >> D;char H[20];  //保存十六进制for(int i = 0; ; i++) {if(D%16>=10 && D%16<16)switch(D%16) {   // 十进制对应的十六进制case 10:H[i] = 'A';break;case 11:H[i] =  'B';break;case 12:H[i] =  'C';break;case 13:H[i] =  'D';break;case 14:H[i] =  'E';break;case 15:H[i] =  'F';}elseH[i] = D%16+'0';D /= 16;if(D==0)break;}int len = strlen(H);for(int i = len-1; i>=0; i--)  cout << H[i];cout << endl;return 0;
}

6.十六进制整数转换十进制

(1).首先明白16进制数(从右到左数是第0位,第1位,第2位……)的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方,依次这样排列下去。
(2).明白ABCDEF表示的二进制数字分别是10,11,12,13,14,15。
(3).十六进制转换成十进制的公式是:要从右到左用十进制的每个数去乘以16的相应次方,然后这些数字相加就是了
例如:F13DH = 15 * 16^3 + 1 * 16^2 + 3 * 16^1 + 13 * 16^0 = 61757D

#include<bits/stdc++.h>
using namespace std;
int main() {char H_1[20];  // 十六进制数列int H_2[20];   // 保存转换后的十进制的cin >> H_1;int len = strlen(H_1);for(int i = 0; i < len; i++) {if(H_1[i]>= '0' && H_1[i]<='9')H_2[i] = H_1[i] - '0';else {switch(H_1[i]) {  // 十六进制对应的十进制case 'A':H_2[i] = H_1[i] - '7';break;case 'B':H_2[i] = H_1[i] - '7';break;case 'C':H_2[i] = H_1[i] - '7';break;case 'D':H_2[i] = H_1[i] - '7';break;case 'E':H_2[i] = H_1[i] - '7';break;case 'F':H_2[i] = H_1[i] - '7';}}}long long  p = len, D=0;for(int i = 0; i < len; i++) {//相应的十进制乘以16相应的次方相加D = D + H_2[i] * pow(16,--p);}cout << D << endl;return 0;
}

7.十六进制整数转换八进制

(1).将十六进制转换十进制
(2).再把转换后的十进制转换八进制
上面已介绍几种常见的进制转换,十六进制转换八进制可以看上面的代码,十六转8代码就不写了。


代码可能不够简化,算法比较直接,若有更简单方法留言一起讨论,感谢!!!


http://www.ppmy.cn/news/678498.html

相关文章

Shell中的流程控制(if/case/for/while)

文章目录 Shell中的流程控制&#xff08;if/case/for/while&#xff09;1 if判断1.1 单分支1.2 多分支 2. case语句3 for循环3.1 第一种写法 (())3.2 第二种写法 in 4 while循环4.1 demo14.2. demo2测试let Shell中的流程控制&#xff08;if/case/for/while&#xff09; 1 if判…

VRP基础操作

目录 一、华为VRP 1.1、VRP介绍 1.2、设备管理接口 1.3、Console口登录 1.4、参数配置 二、华为VRP命令行基础 2.1、真机设备初始化启动 2.2、命令行视图 2.3、命令行功能 2.4、命令行在线帮助 2.5、配置系统时钟 2.6、配置标题消息 2.7、命令等级 2.8、用户界面…

Java_Learning

Java实战 21例 文章目录 第一章 类与对象1.1 面向对象面向对象三个主要特征&#xff1a; 1.2 类与对象1.3 对象内存分析1.4 对象引用分析1.5 引用与垃圾产生分析1.6.1 成员属性封装处理1.6.2 **this**有三种用法&#xff1a;1.7 构造方法与匿名对象1.8 简单Java类&#xff08;超…

日本选购键盘

今天去日本秋叶原电器商城闲逛。发现这里的电器还是挺便宜的。 于是萌生了想买一个机械键盘的冲动。但是挑来挑去。也就是罗技、微软、雷蛇、黑寡妇、FILCO这几个牌子。 主要还是罗技的天下&#xff0c;整整一排都是罗技的键盘鼠标耳机什么的。但是也没看见什么人选。罗技没有…

客制化键盘编程_装机单推荐 篇二:垃圾佬的第一个客制化键盘---gk64升级版

装机单推荐 篇二&#xff1a;垃圾佬的第一个客制化键盘---gk64升级版 2019-09-09 11:55:42 24点赞 89收藏 25评论 你是AMD Yes党&#xff1f;还是intel和NVIDIA的忠实簇拥呢&#xff1f;最新一届#装机大师赛#开始啦&#xff01;本次装机阵营赛分为3A红组、intel NVIDIA蓝绿组、…

2023-07-01 用C语言把科学计数法转换为普通数字,使用double value; sscanf(str, “%lf“, value );就可以做到。

一、在科学计数法中&#xff0c;为了使公式简便&#xff0c;可以用带 “E” 的格式表示。例如 1.09乘10的7次方&#xff0c;可简写为 “1.09E07” 的形式&#xff0c;其中 ”E“ 是 exponent(指数) 的缩写&#xff0c;可以不区分e的大小写&#xff0c;用e或者E都可以。 二、比…

vue+leaflet笔记之地图卷帘

vueleaflet笔记之地图卷帘 本文介绍了Web端使用Leaflet开发库实现地图卷帘效果的方法 (底图来源:中科星图)&#xff0c;结合leaflet-side-by-side插件可以快速简单地实现地图分屏对比效果 &#xff0c;示例效果如下图所示。 开发环境 Vue开发库&#xff1a;3.2.37 & Leaf…

JSP原理以及基本语法

1、JSP原理 什么是JSP&#xff1f; Java Server Pages&#xff1a;Java服务器页面&#xff0c;和Servlet一样是动态Web技术&#xff01; 和HTML的区别&#xff1f; HTML是静态页面。在JSP页面中可以嵌入Java代码&#xff0c;为用户提供动态的数据。 JSP 和 Servlet 的关系…