C++实现各种进制转换笔记记录

前言

进制转换方法是什么?

进制转换的方法是:二进制数,十六进制数可以采用按权展开法转化为十进制数,十进制转化为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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静香是个程序媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值