实现原理
本程序借助10进制数为中介数据,实现任意进制数之间的相互转换(2-36进制范围)
需要注意的是,数值范围不可超出 long long int 所表示的范围,即所输入需要为正数,且要小于 ( 2 ^63) - 1 .(64位处理器计算机)
若需要负值数据,只需要处理第一位的符号位即可.
还有一点,本程序的字母表示全部采用了大写方式,如需要小写字母形式可自行修改.
其实也简单,大小写ASCLL码数值相差32,直接加减即可转换.eg: 'a' - 32 = 'A' .
参考代码
# include "pch.h"
# include <iostream>
# include <string>
# include <cmath>
using namespace std;
class BaseConversion {
private :
const string character = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
int from;
int to;
string source;
string result;
public :
void init ( int from = 10 , int to = 2 , string source = "1024" ) {
this -> from = from;
this -> to = to;
this -> source = source;
}
void computing ( ) ;
int pickIndexNumber ( char ch) {
if ( character. find ( ch) != string:: npos) {
return character. find ( ch) ;
}
else {
cout << "待转换的数据来源不合法,请检查校正后重新输入!/n(提示:不可使用负数符号开头)" << endl;
}
}
string getResult ( ) {
return result;
}
} ;
void BaseConversion :: computing ( ) {
int ten = 10 ;
long long num = 0 ;
if ( from > 1 && from < 37 ) {
for ( int i = 0 ; i < source. length ( ) ; ++ i) {
num += pickIndexNumber ( source[ i] ) * pow ( from, source. length ( ) - i - 1 ) ;
}
cout << "十进制数表示结果为:" << num << endl;
}
else {
cout << "输入进制有误,请确保进制数范围处于[2,36]范围!" << endl;
}
if ( num < to) {
result += character[ num] ;
}
else {
while ( num >= to) {
result = character[ num% to] + result;
num /= to;
}
result = character[ num] + result;
}
}
int main ( )
{
std:: ios:: sync_with_stdio ( false ) ;
std:: cin. tie ( 0 ) ;
int f, t;
string s;
std:: cout << "请输入从from进制转换到to进制的数值source,依次输入from、to、source:\n(提示:字母请使用大写形式,且不可使用负数符号开头)" << endl;
while ( true ) {
cin >> f >> t >> s;
BaseConversion bc;
bc. init ( f, t, s) ;
bc. computing ( ) ;
cout << s << "(" << f << ") ----> " << bc. getResult ( ) << "(" << t << ")" << endl;
}
return 0 ;
}
测试样例
鼠标置于此处可直接预览结果 测试样例2
其他补充
进制转换问题要灵活运用,很多时候并不需要借助10进制作为中介.
抛砖引玉:
16 进制转2进制,直接使用四位串流实现快速转换,即任意一个16进制的位上的数值可转位对应4位二进制数值,采用“8421”快速转换.
同理,32进制则使用五位二进制串流即可,“16,8,4,2,1”.
反过来:
二进制数转十六进制数,可直接采用4位二进制化1位十六进制实现快速转换.
本程序为了便于理解原理和编码实现,“符合人性思维”,权衡之下才用了十进制数作为中介对象.
其实是可以尝试直接转换的,只是很难直接理解、思维可能会不到位.具体内容下次更新时补充.
最后之所以写这么一个进制转换问题,是因为自己即将总结密码编码学知识了.
先为异或运算(相异为真,C++即1)打个前站,预热一下.
后记交流
以上代码和文字纯属手工码字,如有错误欢迎指出、以便我改正/改进代码.
如需交流,请联系QQ/QQ邮箱:2636105163
也可申请加入兴趣群聊,956349248,各种福利小彩蛋详见群资料介绍界面.
2020 /01/01 22 :44
Franklin