c++之基础B(x转10进制,含十六进制)(第四课)
1.前文
2.正文(加遗漏)
2.1x进制转十进制
2.1.1二进制转十进制
2.1.2 八进制转十进制
2.2 十六进制转十进制
2.3 十进制转十六进制
1.前文
好吧,上一次的文章少了十转十六进制的,今天一起补上
2.正文(加遗漏)
2.1x进制转十进制
2.1.1二进制转十进制
这个代码关于权重,我就先简略介绍一下吧
权重,就是指这个位数上的数的数值是多少
比如:
32 16 8 4 2 1
1 1 0 1 1 0
为零的数位上就不计算(也可以计算,装b吗,谁不会呀)
所以,这个二进制数,转成十进制数算式就是这样
(从低位到高位算)
=0*1+1*2+1*4+0*8+1*16+1*32
=0+2+4+0+16+32
=54
所以,我们就要定义一个变量,q(权重的简称(权)的首字母)
然后,就要把代码给放出来了
#include<bits/stdc++.h>
using namespace std;
int main()
{int k,q=1,sum=0;//k是来储存每一位上的数字的string s;cin>>s;int n=s.size();for(int i=n-1;i>=0;i--)//从低位到高位取 {k=s[i]-'0';//将每一位数字字符转成数字 sum=sum+k*q;//乘权重求和q=q*2;//每往前一位,权重扩大2倍,毕竟是二进制转十进制吗}cout<<sum;return 0;
}
2.1.2 八进制转十进制
一样,把第十三行的q=q*2改成q=q*8就行了
#include<bits/stdc++.h>
using namespace std;
int main()
{int k,q=1,sum=0;//k是来储存每一位上的数字的string s;cin>>s;int n=s.size();for(int i=n-1;i>=0;i--)//从低位到高位取 {k=s[i]-'0';//将每一位数字字符转成数字 sum=sum+k*q;//乘权重求和q=q*8;//每往前一位,权重扩大8倍,毕竟是八进制转十进制吗}cout<<sum;return 0;
}
2.1.3 十六进制转十进制
接下来,就是重头戏登场了
首先,十六进制与其他进制不同的是
10=A 11=B 12=C 13=D 14=E 15=F
然后,就是取余
如果取余的数字小于等于9
就把数字字符转成数字
否则,把字母字符转成数字,把这个数减‘A’加10(或直接加55)
如果你不知道为什么要加上55,请看VCR
字符 ASCLL码
A 65
B 66
C 67
D 68
E 69
F 70
举个栗子,,15+55=70
70转成ASCLL码就是F
#include<bits/stdc++.h>
using namespace std;
int main()
{int k,q=1,sum=0;string s;cin>>s;int n=s.size();for(int i=n-1;i>=0;i--)//从低位到高位取 {if(s[i]>='A'&&s[i]<='F'){k=s[i]-'A'+10;//将每一位字母字符转成数字 }else{k=s[i]-'0';//将每一位数字字符转成数字 }sum=sum+k*q;//乘权重求和q=q*16;//每往前一位,权重扩大16倍 }cout<<sum;return 0;
}
懂?
2.2遗漏掉的十转十六进制
跟之前差不多(第一个for循环)
int a[105];
int n,cnt=0;
cin>>n;
for(int i=n;i>=1;i=i/16)
{
cnt++;
a[cnt]=i%16;
}
如果a[i]是个位数,就直接输出
否则输出a[i]加55的char类型
代码,即:
#include<bits/stdc++.h>
using namespace std;
int a[105];
int main()
{int n,cnt=0;cin>>n;for(int i=n;i>=1;i=i/16){cnt++;a[cnt]=i%16;}for(int i=cnt;i>=1;i--){if(a[i]<=9)//个位数直接输出 {cout<<a[i];}else//不是个位需要转成字符 {cout<<char(a[i]+55);}}return 0;
}
(逃!)
新手小白(基础A,不过讲的是基础B)