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

这篇具有很好参考价值的文章主要介绍了实现任意进制(2—32)转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。





实现原理

本程序借助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;//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



文章来源地址https://www.toymoban.com/news/detail-602926.html

其他补充

进制转换问题要灵活运用,很多时候并不需要借助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

到了这里,关于实现任意进制(2—32)转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言【进制转换】35:输出二进制补码

    总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个整型(int)的整数,输出它的32位二进制补码。 输入 一个整型整数。 输出 输出一行,即该整数的补码表示。 样例输入 样例输出 00000000000000000000000000000111 代码实现: 首先要明白 (按位与)和 (左移)的用法 规则: 11=1 10=

    2024年02月07日
    浏览(75)
  • 【Python 千题 —— 基础篇】进制转换:十进制转二进制

    题目描述 计算机底层原理中常使用二进制来表示相关机器码,学会将十进制数转换成二进制数是一个非常重要的技能。现在编写一个程序,输入一个十进制数,将其转换成二进制数。 输入描述 输入一个十进制数。 输出描述 程序将输入的十进制数转换为二进制数,并输出其

    2024年02月07日
    浏览(81)
  • C++十进制与二进制之间的转换

    一般采用\\\"除2取余,逆序排列\\\"法: 也就是将一个十进制数不断除2,将每次得到的余数倒序从后向前排列。 拿求救信号6举个例子: 6/2=3……0  末位就是0 3/2=1……1   前一位就是1 1/2=0……1  再前一位就是1 再画个图辅助理解,这回试试100: 所以100的二进制表达就是1100100 那用

    2024年02月08日
    浏览(50)
  • 进制转换—包含整数和小数部分转换(二进制、八进制、十进制、十六进制)手写版,超详细

    目录 1.进制转换必备知识:         1.1 二进制逢2进1         8进制逢8进1           10进制逢10进1        16进制逢16进1         1.2为了区分二、八、十、十六进制,我们通常在数字后面加字母进行区分 2. 二进制与八进制、十六进制相互转换         2.1 二进制转

    2023年04月23日
    浏览(99)
  • 【进制转换】— 包含整数和小数部分转换(二进制、八进制、十进制、十六进制)手写版,超详细

    目录 1.进制转换必备知识:         1.1 二进制逢2进1         8进制逢8进1           10进制逢10进1        16进制逢16进1         1.2为了区分二、八、十、十六进制,我们通常在数字后面加字母进行区分 2. 二进制与八进制、十六进制相互转换         2.1 二进制转

    2024年02月05日
    浏览(306)
  • PYTHON : 二进制 、 八进制 、十六进制的转换和输出

    十进制转换成其他进制 保存为文本串 二进制 bIn() 八进制 oct() 十六进制 hex() 不输出前缀 使用format函数 如果不想输出进制前面的 前缀符号 , 这时我们就要使用format函数 在这里我们要注意 , 二进制和八进制 的再format里的 符号是‘b’,‘o’ 而十六进制format 里的符

    2023年04月09日
    浏览(78)
  • 二进制与十进制数互相转换的方法及原理

    有人问我一道十进制数转化为二进制数的题:13.625转化为二进制应该如何表示。让我回忆起十多年前学编程时就搞不懂二进制,不找“不必求甚解”的借口,我搜索了一些平台,但很失望,这么多年过去了,能找到的资源依然和以前一样,只讲怎样操作,不提为什么这样操作

    2024年02月04日
    浏览(73)
  • 实现任意进制(2—32)转换

    鼠标置于此处可直接预览结果 测试样例2

    2024年02月16日
    浏览(28)
  • 最好的独热码与二进制转换

    综合结果 提高位宽 综合结果 位宽对综合结果无影响 综合结果 综合结果 这种方法应该是趋于完美的写法,资源耗费较少 根据推断,独热码转换应该是如下情况 如何参数化设计,目前没想到方法; 如果各位有更好的方法可以直接留言

    2024年02月16日
    浏览(51)
  • 【Golang】二进制字符串转换为数字

     在本文中,我们将探讨如何使用 Go 语言将十六进制字符串转换为二进制字符串,将不定长整型补码字符串转换为数字,以及如何将 IEEE754 标准的单精度(32位)和双精度(64位)浮点数字符串转换为数字。最后,我们将讨论如何将布尔类型的二进制字符串转换为布尔值。 这

    2024年01月16日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包