用C++设计一个通用数制转换器,就是数制转换的程序(2-32数制之间的转换)

用C++设计一个通用数制转换器,就是数制转换的程序(2-32数制之间的转换),第1张

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <math.h>

#define MIN_BASE 2

#define MAX_BASE 32

class Transnum

{

public:

static char *transnum(char *num,int base1,int base2,char *_trNum)

{

int i,k,l,m,j

long inum=0

double r=0

i = strlen(num)/* 数值的长度 */

if ((base1<MIN_BASE) || (base1>MAX_BASE) || (base2<MIN_BASE) || (base2>MAX_BASE))

printf("err!")

for (j=0j<ij++) {

r = pow(base1,i-j-1)/* 计算数基的幂指数 */

if (base1<=10) l ='9' - (10 - base1)/* 计算有效的数范围扰稿 */

else {

m = 'a' + (base1 - 11)

l = '9'

}

if ((num[j]>='0') &&(num[j]<=l)) /* 求每清源位缓正孝数字的十进制值 */

k = num[j]-'0'

else if (base1>10) {

/* 求每个字母所代表的十进制值 */

if ((num[j]>='A') &&(num[j]<=m - 32)) //32:大小写字母码表值差

k = num[j] - 'A'+10

else if ((num[j]>='a') &&(num[j]<=m))

k = num[j] - 'a'+10

else printf("err!")

}

else printf("err!")

inum += k * (int) r/* 累加计算结果 */

}

/* 输出转换结果 */

return ltoa(inum,_trNum,base2)

}

protected:

private:

}

int main()

{

char num[20],trNum[30]

int base1,base2

printf("输入待转字符串,初始数制(2-32),目标数制(2-32)\r\n")

scanf("%s %d %d",num,&base1,&base2)

printf("%s(%d) = %s(%d)\n",num,base1,Transnum::transnum(num,base1,base2,trNum),base2)

return 0

}

这里是进制转换的方法!!!!!

计算机中常用的数的进制主要有:二进制、八进制、十六进制,学习计算机要对其有所了解。

2进制,用两个阿拉伯数字:0、1;

8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;

10进制,用十个阿拉伯数字:0到9;

16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,宏唯15。字母不区分大小写。

以下简介各种进制之间的转换方法:

一、二进制转换十进制

例:二进制 “1101100”

1101100 ←二进制数

6543210 ←排位方法

例如二进制换算十进制的算法:

1*26 + 1*25 + 0*24 + 1*23 + 1* 22 + 0*21 + 0*20

↑ ↑

说明:2代表进制,后面的数是次方(从右往左数,以0开始)

=64+32+0+8+4+0+0

=108

二、二进制换算八进制

例:二进制的“10110111011”

换八进制时,从右到左,三位一组,不够补0,即成了:

010 110 111 011

然后每组中的3个数分别对应4、2、1的状态,然后将为状态为1的相加,如:

010 = 2

110 = 4+2 = 6

111 = 4+2+1 = 7

011 = 2+1 = 3

结果为:2673

三、二进制转换十六进制

十六进制换二进制的方法也类似,只要每组4位,分别对应8、4、2、1就行了,如分解为:

0101 1011 1011

运算为:

0101 = 4+1 = 5

1011 = 8+2+1 = 11(由于10为A,所以11即B)

1011 = 8+2+1 = 11(由于10为A,所以11即B)

结果为:5BB

四、二进制数转换为十进制数

二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……

所以,设有一个二进制数:0110 0100,转换为10进制为:

计算: 0 * 20 + 0 * 21 + 1 * 22 + 1 * 23 + 0 * 24 + 1 * 25 + 1 * 26 + 0 * 27 = 100

五、八进制数转换为十进制数

八进制就是逢8进1。

八进制数采用 0~7这八数来表达一蔽岩培个数。

八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……

所以,设有一个八进制数:1507,转换为十进制为:

计算: 7 * 80 + 0 * 81 + 5 * 82 + 1 * 83 = 839

结果是,八进制数 1507 转换成十进制数为 839

六、十六进制转换十进制

例:2AF5换算成10进制

直接计算就是: 5 * 160 + F * 161 + A * 162 + 2 * 163 = 10997

(别忘了,在上面的计算中,A表示10,而F表示15)、

现在可以看出,所有进制换算成10进制,关键在于各自的权值不同。

假设有人问你,十进数 1234 为什么是 一千二百三十枣让四?你尽可以给他这么一个算式: 1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12307527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存