了解进制:
进制问题 :2进制 8进制 10进制 16进制
进制之间的转换 编程实现进制之间的转换
整数进制转换
小数进制转换
满多少进1 10进制满10进1 ; 2进制满2进1
10进制转2进制 :短除法
转换过程:用10进制数除以2,取余数,当10进制为0的时候结束
这个10进制对应的2进制数就是逆序的余数
123(10)=111 1011(2)
47(10)=10 1111(2)
77(10)=100 1101(2)
10进制转8进制
转换过程:用10进制数除以8,取余数,当10进制为0的时候结束
这个10进制对应的8进制数就是逆序的余数
123(10)=173(8)
47(10)=57(8)
77(10)=115(8)
10进制转16进制
转换过程:用10进制数除以16,取余数,当10进制为0的时候结束
这个10进制对应的16进制数就是逆序的余数
规定:10~15 ==> A~F
123(10)=7B(16)
47(10)=2F(16)
77(10)=4D(16)
2进制转8进制 转16进制的快捷方法:
规定:1个8进制位等于3个二进制位;
1个16进制位等于4个二进制位;
计算的时候从最右边开始 ,不够位数高位补0
101 011 000 111 100 111(2)
=530747(8)
0010 1011 0001 1110 0111(2)
=2B1E7(16)
011 100 101 011 010 111 101 110(2)
=34532756(8)
0111 0010 1011 0101 1110 1110(2)
=72B5EE(16)
011 011 001 010 110 001 011(2)
=3312613(8)
1101 1001 0101 1000 1011(2)
=D958B(16)
64732521(8)
=110 100 111 011 010 101 010 001(2)
937B6E8F(16)
=1001 0011 0111 1011 0110 1110 1000 1111(2)
64523567(8)
=110 100 101 010 011 101 110 111(2)
FE628DA9(16)
=1111 1110 0110 0010 1000 1101 1010 1001(2)
2进制转10进制
总结:从进制位的最右边开始用对应的位数的数字*2^n次方的和
n从0开始递增
10101(2)=21(10)
8进制转10进制
总结:从进制位的最右边开始用对应的位数的数字*8^n次方的和
n从0开始递增
16进制转10进制
总结:从进制位的最右边开始用对应的位数的数字*16^n次方的和
n从0开始递增
10110(2)=22(10)
4302(8)=2242(10)
A15(16)=2571(10)
练习1:
cpp
#include<iostream>
#include<cstdio>
using namespace std;
/*
进制转换
描述
将一个长度最多为19位数字的十进制非负整数转换为二进制数输出。
输入
多组数据,每行为一个长度不超过19位的十进制非负整数。
输出
每行输出对应的二进制数。
样例输入
0
1
3
8
样例输出
0
1
11
1000
*/
int n,a[25],xb;
void f(int n){
xb=0;
if(n==0) cout<<0;
while(n){
a[++xb]=n%2;
n/=2;
}
for(int i=xb;i>=1;i--) cout<<a[i];
cout<<endl;
}
int main(){
while(cin>>n){
f(n);
}
return 0;
}
其他进制转十进制:
cpp
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
char a[105];
int jz;
//将进制jz的数字转换成10进制
int change(char a[],int jz){
int len=strlen(a),s=0;
//110101
for(int i=len-1;i>=0;i--){
if(a[i]>='A' && a[i]<='F'){
s+=(a[i]-55)*pow(jz,len-i-1);
}else{
s+=(a[i]-48)*pow(jz,len-i-1);
}
}
return s;
}
int main(){
cin>>a>>jz; //输入的是什么进制
cout<<change(a,jz);
return 0;
}
十进制小数如何转:
cpp
小数进制的转换
10转2
转换过程:
对应的小数部分乘以2 取整数部分,顺序,小数部分为0
0.625(10)=0.101(2)
0.5(10)=0.1(2)
0.25(10)=0.01(2)
0.125(10)=0.001(2)
0.0625(10)=0.0001(2)
10转8
转换过程:
对应的小数部分乘以8 取整数部分,顺序,小数部分为0
10转16
转换过程:
对应的小数部分乘以16 取整数部分,顺序,小数部分为0
A~F 代替 10~15
2转10进制小数
0.1011(2)= (10)
2转8进制小数
规定:从小数点右边开始每3位二进制数代表1位8进制数,最后面补0
2转16进制小数
规定:从小数点右边开始每4位二进制数代表1位16进制数 ,最后面补0
进制转换程序:
cpp
#include<iostream>
#include<cstdio>
using namespace std;
//int 2^32-1 2147483647
//10转2-8-16进制
/*
用10进制数除以2,取余数,当10进制为0的时候结束
这个10进制对应的2进制数就是逆序的余数
*/
//10转2的函数
//int n,a[35],xb;
//void change2(int n){
// while(n){
// a[++xb]=n%2;
// n/=2;
// }
// for(int i=xb;i>=1;i--) cout<<a[i];
//}
10转8 数组名 b
//int b[35],bx;
//void change8(int n){
// while(n){
// b[++bx]=n%8;
// n/=8;
// }
// for(int i=bx;i>=1;i--) cout<<b[i];
//}
//int a[35],xb;
//void change28(int n,int jz){ //低于10进制的数字都可以使用的函数
// while(n){
// a[++xb]=n%jz;
// n/=jz;
// }
// for(int i=xb;i>=1;i--) cout<<a[i];
//}
//10转16的 10~15 A~F 数组名h
char a[35];
int xb;
void change16(int n){
while(n){
// '0'=48
// 'A'=65
if(n%16>9){
a[++xb]=55+n%16;
}else{
a[++xb]=48+n%16;
}
n/=16;
}
for(int i=xb;i>=1;i--) cout<<a[i];
}
int main(){
cin>>n;
return 0;
}