进制转换
二进制Bar 八进制Oct,十进制Decimal,十二进制BE,十楼进制Hex
计算机的数制介绍
数制:计数的方法,指用一组固定的符号和统一的规则来表示数值的方法
数位:指数字符号在一个数中所处的位置
基数:指在某种进位计数制中,数位上所能使用的数字符号的个数
位权:指在某种进位计数制中,数位所代表的大小,即处在某一位上的“1”所表示的数值的大小。
这些东西等一会涉及到二进制的核心思想,从某种程度上讲,其他转二位作为一个环节跳板,然后转到目的进制
转化例子
- 正整数的十进制转换二进制
将一个十进制数除以二,得到的商再除以二,依此类推直到商等于一或零时为止,倒取除得的余数,即换算为二进制数的结果。只需记住要点:除二取余,倒序排列。
由于计算机内部表示数的字节单位都是定长的,以2的幂次展开,或者8位,或者16位,或者32位…。于是,一个二进制数用计算机表示时,位数不足2的幂次时,高位上要补足若干个0。 - 二进制转换为十进制
二进制转十进制的转换原理:从二进制的右边第一个数开始,每一个乘以2的n次方,n从0开始,每次递增1。然后得出来的每个数相加即是十进制数。 - 十进制转换为十六进制
- 十六进制转换为十进制(这里不再展示过程,不常用)
十六进制数转十进制数方法:十六进制数按权展开,从十六进制数的右边第一个数开始,每一个乘以16的n次方,n从0开始,每次递增1。然后得出来的每个数相加即是十进制数。 - 二进制转十六进制(这里不再展示过程,不常用)
方法为:与二进制转八进制方法近似,八进制由三个二进制数表示,十六进制是四个二进制数表示。(注意事项,4位二进制转成十六进制是从右到左开始转换,不足时补0) - 十六进制转二进制(这里不再展示过程,不常用)
方法为:十六进制数通过除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)
真正整理和考证得出来的最简的进制方式,
给一碰到进制就迷的同学一点帮助吧