北京展览馆网站建设,企业网站主要有哪四种类型,个人备案网站 内容,工程模板多少钱一张2020/01/01 实现原理参考代码测试样例其他补充后记交流 实现原理
本程序借助10进制数为中介数据#xff0c;实现任意进制数之间的相互转换#xff08;2-36进制范围#xff09;
需要注意的是#xff0c;数值范围不可超出 long long int 所表示的范围#xff0c;即所输入需… 2020/01/01 实现原理参考代码测试样例其他补充后记交流 实现原理
本程序借助10进制数为中介数据实现任意进制数之间的相互转换2-36进制范围
需要注意的是数值范围不可超出 long long int 所表示的范围即所输入需要为正数且要小于 (2^63) - 1 .64位处理器计算机
若需要负值数据只需要处理第一位的符号位即可.
还有一点本程序的字母表示全部采用了大写方式如需要小写字母形式可自行修改.
其实也简单大小写ASCLL码数值相差32,直接加减即可转换.eg: a - 32 A.参考代码
// 进制转换.cpp : 此文件包含 main 函数。程序执行将在此处开始并结束。
//#include pch.h
#include iostream
#include string
#include cmath
using namespace std;class BaseConversion {
private:const string character 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ;//从from进制数source转为to进制数result;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;//转为10进制后的数值结果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;//numto的时候作为个位所在数值;}
}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