c++最全进制转化(含算法和函数分析)

进制转换

二进制Bar 八进制Oct,十进制Decimal,十二进制BE,十楼进制Hex

计算机的数制介绍

数制:计数的方法,指用一组固定的符号和统一的规则来表示数值的方法
数位:指数字符号在一个数中所处的位置
基数:指在某种进位计数制中,数位上所能使用的数字符号的个数
位权:指在某种进位计数制中,数位所代表的大小,即处在某一位上的“1”所表示的数值的大小。
这些东西等一会涉及到二进制的核心思想,从某种程度上讲,其他转二位作为一个环节跳板,然后转到目的进制

转化例子

  1. 正整数的十进制转换二进制
    将一个十进制数除以二,得到的商再除以二,依此类推直到商等于一或零时为止,倒取除得的余数,即换算为二进制数的结果。只需记住要点:除二取余,倒序排列。
    由于计算机内部表示数的字节单位都是定长的,以2的幂次展开,或者8位,或者16位,或者32位…。于是,一个二进制数用计算机表示时,位数不足2的幂次时,高位上要补足若干个0。
  2. 二进制转换为十进制
    二进制转十进制的转换原理:从二进制的右边第一个数开始,每一个乘以2的n次方,n从0开始,每次递增1。然后得出来的每个数相加即是十进制数。
  3. 十进制转换为十六进制
  4. 十六进制转换为十进制(这里不再展示过程,不常用)
    十六进制数转十进制数方法:十六进制数按权展开,从十六进制数的右边第一个数开始,每一个乘以16的n次方,n从0开始,每次递增1。然后得出来的每个数相加即是十进制数。
  5. 二进制转十六进制(这里不再展示过程,不常用)
    方法为:与二进制转八进制方法近似,八进制由三个二进制数表示,十六进制是四个二进制数表示。(注意事项,4位二进制转成十六进制是从右到左开始转换,不足时补0)
  6. 十六进制转二进制(这里不再展示过程,不常用)
    方法为:十六进制数通过除2取余法,得到二进制数,每个十六进制数为4个二进制数表示,不足时在最左边补零。

算法实现

int change(int n)
{
	int num = (n / 任意进制) * 10 + (n % 任意制度);
}
这个代码是返回值是整形,
十进制的非字母性质的转置
重点是二进制作为计算语言中的关键所在。string的有效类是关键。
string bar(int n)
{
	string s = "";
	for (int a = n; a; a = a / 2)
	{
		s += (a % 2 ? '1' : '0');
	}
	std::reverse(s.begin(), s.end());
	return s;
}

需要注意的是printf的输出只是属于char的大类,对于string或者其他的xxxx,需要依靠c_Str()函数来进行改变,涉及到其他层次的高位字母进制,还要考虑到其他的情况
之后是包括字母的进制转化

string be(int n)
{
	string s = "";
	do {
		if (n % 16 >= 10)
		{
			s += n % 16 - 10 + 'A';
		}
		else
			s += n % 16 + '0';
	} while (n);
	return s;
	
}
string be(int n)
{
	int *ans = new int[40];
	int cot = 0;
	do {
		if (n % 16 >= 10)
		{
			ans[cot++]= n % 16 - 10 + 'A';
		}
		else
			ans[cot++]= n % 16 + '0';
	} while (n);
	return ans;
}

这是有十进制转变的十六进制的两种方法,一种似string形式也就是进制转换互通的一个简单模式,
另一种是数组形式的ans时刻需要和cot相互关联在一起。如果需要把他变成12进制也只是%12的改变,因为需要的字母根据ASCII码自己就会有所更改。

  • 二进制为主的转换
    16进制0-15,用二进制表现为四位数关联一位数
    8进制0-7,用二进制三位数来换算一位数
    10进制依靠运算基础的积累搭建即可
    dec版的int形式
int dec(int n)
{
	int num = 0; int cot = 1;
	while (n)
	{
		num += n % 10 * cot;
		cot *= 2;
		n = n / 10;
	}
	return num;
}如果使用string类来写进制的话,同样包涵赋值的关系
string hex(int n)
{
	string s1 = to_string(n);
	string s2 = "";
	int pro = 1, sum = 0;
	for (int x = s2.length() - 1; x >= 0; x--)
	{
		sum += (s2[x] - '0') * pro;
		pro = pro * 2;
		if (x % 4 == 0)
		{
			if (sum >= 10)
				sum += sum - 10 + 'A';
			else {
				s2 += sum + '0';
			}
			pro = 1; sum = 0;
		}

	}std::reverse(s2.begin(), s2.end());
	printf("%s", s2.c_str());
}

值得注意的是,十进制转字符to_string,字符串转十进制stoi,两个独特的的系统自带函数
十二进制和八进制都是用,这一个即可
而且十二进制考虑到字符串的对应限制,所以用2转10之后转12(非字母)
含字母的同样使用如上的方式
之后是16,8,4转二进制
这种高进低的使用性质,利用switch case的对应形式
同样的理论使用于八进制
case 0:000 4:100
1:001 5:101
2:010 6:110
3:011 7:111


int convertBinarytoOctal(long long binaryNumber)
{
    int octalNumber = 0, decimalNumber = 0, i = 0;
 
    while(binaryNumber != 0)
    {
        decimalNumber += (binaryNumber%10) * pow(2,i);
        ++i;
        binaryNumber/=10;
    }
 
    i = 1;
 
    while (decimalNumber != 0)
    {
        octalNumber += (decimalNumber % 8) * i;
        decimalNumber /= 8;
        i *= 10;
    }
 
    return octalNumber;
}

这个是二进制变成八进制的整数型
综上所述,只要有了string形式和int形式,就可以做到任意转换
这都是算法角度的分析和成列
下面在提一下系统std自带的转换方式

1.在C中,按指定进制格式输出如下,

printf("%05o\n",35);    //按八进制格式输出,保留5位高位补零
printf("%03d\n",35);    //按十进制格式输出,保留3位高位补零
printf("%05x\n",35);    //按十六进制格式输出,保留5位高位补零
2.在C++中,按指定进制格式输出如下,

#include <bitset>  
#include<iostream>
using namespace std;  
int main()  
{  
    cout << "35的8进制:" << std::oct << 35<< endl;  
    cout << "35的10进制" << std::dec << 35 << endl;  
    cout << "35的16进制:" << std::hex << 35 << endl;  
    cout << "35的2进制: " << bitset<8>(35) << endl;      //<8>:表示保留8位输出
    return 0;  
}
函数原型:long int strtol(const char *nptr, char **endptr, int base)

真正整理和考证得出来的最简的进制方式,
给一碰到进制就迷的同学一点帮助吧

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

磊哥哥讲算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值