前言
进制转换方法是什么?
进制转换的方法是:二进制数,十六进制数可以采用按权展开法转化为十进制数,十进制转化为R进制要分为两部分,其中整数部分要除R取余,直到商为0,小数部分要乘R取余直到得到整数。
进制也就是进制位,对于接触过电脑的人来说应该都不陌生,我们常用的进制包括:二进制、八进制、十进制与十六进制,它们之间区别在于数运算时是逢几进一位。比如二进制是逢2进一位,十进制也就是我们常用的0-9是逢10进一位。接下来将在文章中为大家详细介绍,并在最后,利用C++编写16进制数转换为8进制数,16进制转换为10进制,10进制转换为2、8、16进制,附带代码,希望对大家有所帮助。
一、简述
进位计数制:是人们利用符号来计数的方法。一种进位计数制包含一组数码符号和两个基本因素。
数码:用不同的数字符号来表示一种数制的数值,这些数字符号称为“数码”。
基:数制所使用的数码个数称为”基”。
权:某数制每一位所具有的值称为”权”。
二:进制转换的理论
二进制数、十六进制数转换为十进制数
用按权展开法把一个任意R进制数
an an-1 …a1a0 . a-1 a-2…a-m
转换成十进制数,其十进制数值为每一位数字与其位权之积的和。
an×R n + an-1×R n-1 +…+ a1×R 1 + a0×R 0 + a-1 ×R-1+ a-2×R-2+ …+ a-m×R-m
十进制转化成R进制
十进制数轮换成R进制数要分两个部分:
整数部分:除R取余数,直到商为0,得到的余数即为二进数各位的数码,余数从右到左排列(反序排 列)。
小数部分:乘R取整数,得到的整数即为二进数各位的数码,整数从左到右排列(顺序排列)。
十六进制转化成二进制
每一位十六进制数对应二进制的四位,逐位展开。
二进制转化成十六进制
将二进制数从小数点开始分别向左(对二进制整数)或向右(对二进制小数)每四位组成一组,不足四位补零。
我们最常见的进制转换就是十进制转换为二进制了,就是不停的作除法,取余数。
例如:十进制的10转换为二进制
10÷2=5···0
5÷2=2···1
2÷2=1···0
1÷2=0···1
直到商为0,然后把余数倒着写,所以10的二进制表示为1010。
十进制->N进制
会了十进制转换为二进制,那么十进制转换为任意进制也就迎刃而解了,只要不停的除法和取余就好了。
#include <iostream>
#include <cstdio>
#include <stack>
/*
* 进制转换 10——>n(n<10)
* */
using namespace std;
void ConvertT2N(int number,int n){
stack<char> s;
if (number == 0) { //特殊情况,当输入是0时,输出也是0,否则输入0时就卡那了
s.push(0);
} else {
while (number) {
s.push(number % n);
number /= n;
}
}
// 把栈中的余数输出
while (!s.empty()) {
printf("%d", s.top());
s.pop();
}
printf("\n");
}
int main(){
int number;
while (scanf("%d", &number) != EOF) {
ConvertT2N(number, 2);
}
return 0;
}
但是上面的代码是有一点小问题的,它只能转换10以内的进制,也就是N必须小于10,否则就会出错。例如十进制转换成十六进制就会出错。例如11转换成十六进制表示为b而不是11,因为当表示十进制以上的数时需要用到字母a,b,c,d等等。
所以需要在输出的余数上面加加工一下,把大于10的数用字母表示。
改进版代码如下:
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
// 把整数转换成对应进制的字符,例如10的十六进制中表示为A
char Int2Char(int target){
if (target < 10) {
return target + '0';
} else {
return target - 10 + 'A';
}
}
/*
* 现在N可以取任意进制了
* */
void ConvertT2N(int number,int n){
stack<char> s; //因为要存字母所以用char
if (number == 0) { //特殊情况,当输入是0时,输出也是0,否则输入0时就卡那了
s.push(0);
} else {
while (number) {
s.push(Int2Char(number % n)); //在余数入栈时加工一下,把int转换成char
number /= n;
}
}
// 把栈中的余数输出
while (!s.empty()) {
printf("%c", s.top());
s.pop();
}
printf("\n");
}
int main(){
int number;
while (scanf("%d", &number) != EOF) {
ConvertT2N(number, 16);//把十进制转换为十六进制
}
return 0;
}