实现任意进制(2—32)转换

2020/01/01

实现原理

bash 复制代码
本程序借助10进制数为中介数据,实现任意进制数之间的相互转换(2-36进制范围)
需要注意的是,数值范围不可超出 long long int 所表示的范围,即所输入需要为正数,且要小于 (2^63) - 1 .(64位处理器计算机)
若需要负值数据,只需要处理第一位的符号位即可.
还有一点,本程序的字母表示全部采用了大写方式,如需要小写字母形式可自行修改.
其实也简单,大小写ASCLL码数值相差32,直接加减即可转换.eg: 'a' - 32 = 'A'.

参考代码

cpp 复制代码
// 进制转换.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;//num<to的时候,作为个位所在数值;
	}
}

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

其他补充

bash 复制代码
进制转换问题要灵活运用,很多时候并不需要借助10进制作为中介.
抛砖引玉:
16进制转2进制,直接使用四位串流实现快速转换,即任意一个16进制的位上的数值可转位对应4位二进制数值,采用"8421"快速转换.
同理,32进制则使用五位二进制串流即可,"16,8,4,2,1".
反过来:
二进制数转十六进制数,可直接采用4位二进制化1位十六进制实现快速转换.
bash 复制代码
本程序为了便于理解原理和编码实现,"符合人性思维",权衡之下才用了十进制数作为中介对象.
其实是可以尝试直接转换的,只是很难直接理解、思维可能会不到位.具体内容下次更新时补充.
bash 复制代码
最后之所以写这么一个进制转换问题,是因为自己即将总结密码编码学知识了.
先为异或运算(相异为真,C++即1)打个前站,预热一下.

后记交流

bash 复制代码
以上代码和文字纯属手工码字,如有错误欢迎指出、以便我改正/改进代码.
如需交流,请联系QQ/QQ邮箱:2636105163
也可申请加入兴趣群聊,956349248,各种福利小彩蛋详见群资料介绍界面.
bash 复制代码
2020/01/01 22:44
Franklin
相关推荐
Never_Satisfied19 天前
非对称任意进制转换器(安卓)
安卓·进制转换
zhuqiyua1 个月前
直接调用本地API(NTAPI)
操作系统·windbg·逆向·二进制·osed
风间琉璃""1 个月前
二进制与网络安全的关系
安全·机器学习·网络安全·逆向·二进制
zhuqiyua1 个月前
深入解析Kernel32.dll与Msvcrt.dll
汇编·microsoft·windbg·二进制·dll
zhuqiyua1 个月前
windows二进制安全零基础(二)
汇编·安全·二进制
Espresso Macchiato1 个月前
Leetcode 3352. Count K-Reducible Numbers Less Than N
动态规划·二进制·leetcode hard·leetcode 3352·leetcode周赛423
sweetheart7-71 个月前
LeetCode78. 子集(2024秋季每日一题 58)
二进制·dfs·枚举·数组·子集
centos082 个月前
PWN(栈溢出漏洞)-原创小白超详细[Jarvis-level0]
网络安全·二进制·pwn·ctf
IZGRI2 个月前
进制转换详解
数据结构·c++·算法·进制转换
Tisfy2 个月前
LeetCode 3211.生成不含相邻零的二进制字符串:二进制枚举+位运算优化
算法·leetcode·二进制·题解·枚举·位运算