进制间的转换
进制转换方法是什么?
进制转换的方法是:二进制数,十六进制数可以采用按权展开法转化为十进制数,十进制转化为R进制要分为两部分,其中整数部分要除R取余,直到商为0,小数部分要乘R取余直到得到整数。
进制也就是进制位,对于接触过电脑的人来说应该都不陌生,我们常用的进制包括:二进制、八进制、十进制与十六进制,它们之间区别在于数运算时是逢几进一位。比如二进制是逢2进一位,十进制也就是我们常用的0-9是逢10进一位。接下来将在文章中为大家详细介绍,并在最后,利用C++编写16进制数转换为8进制数,16进制转换为10进制,10进制转换为2、8、16进制,附带代码,希望对大家有所帮助。
一、简述
进位计数制:是人们利用符号来计数的方法。一种进位计数制包含一组数码符号和两个基本因素。
- 数码:用不同的数字符号来表示一种数制的数值,这些数字符号称为“数码”。
- 基:数制所使用的数码个数称为”基”。
- 权:某数制每一位所具有的值称为”权”。
二:进制转换的理论
-
二进制数、十六进制数转换为十进制数
用按权展开法把一个任意R进制数
an an-1 …a1a0 . a-1 a-2…a-m
转换成十进制数,其十进制数值为每一位数字与其位权之积的和。
an×R n + an-1×R n-1 +…+ a1×R 1 + a0×R 0 + a-1 ×R-1+ a-2×R-2+ …+ a-m×R-m
-
十进制转化成R进制
十进制数轮换成R进制数要分两个部分:
整数部分:除R取余数,直到商为0,得到的余数即为二进数各位的数码,余数从右到左排列(反序排 列)。
小数部分:乘R取整数,得到的整数即为二进数各位的数码,整数从左到右排列(顺序排列)。
-
十六进制转化成二进制
每一位十六进制数对应二进制的四位,逐位展开。
-
二进制转化成十六进制
将二进制数从小数点开始分别向左(对二进制整数)或向右(对二进制小数)每四位组成一组,不足四位补零。
另外增加一篇学习过程中,对我帮助很大的一篇文章: 二进制与8,10,16转换
三:十六进制转八进制代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
int i,j,k;
int n;//存放输入几个十六进制数
string s1;//存放输入的十六进制数
string s2;//存放二进制数
cin>>n;
for(i=0;i<n;i++)
{
cin>>s1;//依次输入十六进制数 例:39
s2="";
for(j=0;j<s1.length();j++)
{
switch (s1[j]) //依次转为2进制 例:39 s1[0]=3 s2=0011 ---- s1[1]=9 s2=0011+1001= 0011 1001
{
case '0':s2+="0000";break;
case '1':s2+="0001";break;
case '2':s2+="0010";break;
case '3':s2+="0011";break;
case '4':s2+="0100";break;
case '5':s2+="0101";break;
case '6':s2+="0110";break;
case '7':s2+="0111";break;
case '8':s2+="1000";break;
case '9':s2+="1001";break;
case 'A':s2+="1010";break;
case 'B':s2+="1011";break;
case 'C':s2+="1100";break;
case 'D':s2+="1101";break;
case 'E':s2+="1110";break;
case 'F':s2+="1111";break;
default:break;
}
}
//将二进制数转为 八进制数 由数字逻辑所学知识 111(2)--->7(8) 即三位后进位 需要使得s2的长度能够对3整除
if(s2.length()%3==1)
{
s2="00"+s2;
}
//8%3==2 需要补充一位 000111001 ---> 000 111 001
if(s2.length()%3==2)
{
s2="0"+s2;
}
int flag=0;
// i<7 即为 j(max)=6
for(k=0;k<s2.length()-2;k+=3)
{
//字符串进行加减乘除操作 '1'-'0'=1 '0'-'0'=0
int output=4*(s2[k]-'0')+2*(s2[k+1]-'0')+s2[k+2]-'0';
//第一组 0 1 2 000 111 001
//这里是为防止输入的十六进制数,输出的八进制数最前方有0的情况
//同时在数据中间部分的0也要输出,否则输出错误
/*
* 931FA
*
* //010 010 011 "000" 111 111 010
*
* */
if(output)
{
flag=1;
}
if(flag)
{
cout<<output;
}
}
cout<<endl;
}
return 0;
}
四:十六进制转十进制代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1,s2;
int i,j;
long long sum=0;
s2="";
cin>>s1;
for(i=0;i<s1.length();i++)
{
switch(s1[i]){
case '0':s2+="0000";break;
case '1':s2+="0001";break;
case '2':s2+="0010";break;
case '3':s2+="0011";break;
case '4':s2+="0100";break;
case '5':s2+="0101";break;
case '6':s2+="0110";break;
case '7':s2+="0111";break;
case '8':s2+="1000";break;
case '9':s2+="1001";break;
case 'A':s2+="1010";break;
case 'B':s2+="1011";break;
case 'C':s2+="1100";break;
case 'D':s2+="1101";break;
case 'E':s2+="1110";break;
case 'F':s2+="1111";break;
default:break;
}
}
for(j=0;j<s2.length();j++)
{
sum=sum*2+s2[j]-'0';
}
cout<<sum;
return 0;
}
五:十进制转十六进制代码
#include<iostream>
#include<stack>
using namespace std;
int main()
{
//十进制数
long long n;
//基:16 2为二进制,8为八进制
int base=16;
cin>>n;
//创建栈
stack<char>S;
char a[]="0123456789ABCDEF";
if(n==0) S.push(a[0]);
//余数进栈
while(n>0)
{
S.push(a[n%base]);
n/=base;
}
//十六进制出栈
while(!S.empty())
{
cout<<S.top();
S.pop();
}
}