目录
进制的相关概念
1.数码
在数制中表示数制大小的符号,比如十进制的数码(0,1,2,3,4,5,6,7,8,9),二进制数码(0,1)
2.基数
在数制中数码的个数,例如十进制的基数为10,二进制为2
3.位权
在数制中,某位上1所代表的数值的大小称为位权,通常用基数来表示
例如十进制数字123,3的位权10^0,2的位权10^1,1的位权10^2
二进制数101,最右边1的位权2^0,0的位权2^1,最左边1的位权2^2
十进制转非十进制
方法:用十进制数除以非十进制的基数,取余数倒着写
以十进制数48转二进制为例,
得到的二进制数为110000
c++实现:
#include <bits/stdc++.h>
using namespace std;
string tranNum(int &num){
string str;
int x;
char op;
while(num>0){
x = num % 2;//每一次取得的余数
op = '0' + x;//得到的二进制数(字符)
str = op + str;//加到字符串里面,注意是加到最前面,因为余数要倒着写,这里不能写成 str = str + op;
num /= 2;
}
return str;
}
int main(){
int num;
string str;//str用来接收字符串型的二进制数
cout << "输入一个十进制数" << endl;
cin >> num;
str = tranNum(num);
cout << "对应的二进制数为:" << str;
}
输入:48
输出:110000
如果将十进制数转换为十六进制等大于10的进制,因为涉及到字母,代码如下:
#include <bits/stdc++.h>
using namespace std;
string num_str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string tranNum(int &num, int &target){
string str;
int x;
char op;
while(num>0){
x = num % target;
op = num_str[x];
str = op + str;
num /= target;
}
return str;
}
int main(){
int num,target;
string str;
cout << "输入一个十进制数 和 一个您想转换的进制" << endl;
cin >> num >> target;
str = tranNum(num,target);
cout << "对应的数为:" << str;
}
输入:48 16
输出:30
非十进制转十进制
方法:乘权求和,每一位数乘以对应的位权相加
以二进制数1111转十进制数为例:
得十进制数为15
c++实现:
#include <bits/stdc++.h>
using namespace std;
int tranNum(string &str, int &scale){
int num = 0;
int i = 0,x;
char op;
while(i < str.length()){
op = str[i];
if(op >= '0' && op <= '9')
x = op - '0';
else if(op >= 'a' && op <= 'z')
x = op - 'a' + 10;
else if(op >= 'A' && op <= 'Z')
x = op - 'A' + 10;
//乘权求和
num = num * scale + x;
i++;
}
return num;
}
int main(){
string str;
int scale;
cout << "输入一个字符串,一个进制" << endl;
cin >> str >> scale;
int num = tranNum(str,scale);
cout << "对应的十进制数为:" << num << endl;
}
输入:1111 2
输出 :15
二进制转八进制
方法:每三位二进制数转换为一位八进制数,先将二进制数3个为一组(如果二进制数的位数不是3的倍数,在右侧补0),然后每三位乘权求和作为八进制的一位
以二进制数1110转八进制为例:
得八进制数16
c++实现:
#include <bits/stdc++.h>
using namespace std;
char compute(string &num){//返回每三位所对应的数
char op;
int number=0;
for(int i = 0; i < num.size(); i++){
number = number*2 +num[i]-'0';
}
op = '0' + number;
return op;
}
string tranNum(string &str){
int len = str.length();
if(len % 3 == 1)
str = "00" + str;
else if(len % 3 == 2)
str = "0" + str;
string target;
for(int i = 0; i< str.length() - 1; i += 3){
string num = str.substr(i,3);
char op = compute(num);
target = target + op;
}
return target;
}
int main(){
string str;
cout << "请输入一个二进制数:" << endl;
cin >> str;
string target;
target = tranNum(str);
cout << "八进制数为:" << target << endl;
}
输入:1110
输出:16
八进制转二进制
由二进制转八进制可知,每一位八进制数对应三位二进制数,所以,对每一位八进制数把他拆分为三位二进制数,然后组合到一起就可以了
对于八进制数0~7所对应的二进制数,我们可以把它放入一个数组中:
string nums[]={"000","001","010","011","100","101","110","111"};
然后从八进制数的最左边开始,一位一位的转换,转换完成之后,不要忘了把多余的前导0删除
c++实现:
#include <bits/stdc++.h>
using namespace std;
//八进制数0~7所对应的二进制数
string nums[]={"000","001","010","011","100","101","110","111"};
string tranNum(string &str){
string target;
for(int i = 0; i < str.length(); i++){
int x = str[i]-'0';
target += nums[x];
}
//下面删除多余的前导0
int count = 0;
while(target[count] == '0')
count++;
target.erase(0,count);
return target;
}
int main(){
string str;
cout << "请输入一个八进制数" << endl;
cin >> str;
string target = tranNum(str);
cout << "对应的二进制数为:" << target;
}
输入:10
输出:1000
二进制转十六进制
方法:与二进制转八进制类似,只不过每四位二进制数对应一位十六进制数,也是先判断二进制数是否为四的倍数,不是则在前面补0,然后再每四位为一组转换
代码如下:
#include <bits/stdc++.h>
using namespace std;
char compute(string &num){//返回每四位所对应的数
char op;
int number=0;
for(int i = 0; i < num.size(); i++){
number = number*2 +num[i]-'0';
}
if(number<10)
op = '0' + number;
else//这一位十六进制就不是数字了,是个字母
op= number - 10 + 'A';
return op;
}
string tranNum(string &str){
int len = str.length();
if(len % 4 == 1)
str = "000" + str;
else if(len % 4 == 2)
str = "00" + str;
else if(len % 4 == 3)
str = "0" + str;
string target;
for(int i = 0; i< str.length() - 1; i += 4){
string num = str.substr(i,4);
char op = compute(num);
target = target + op;
}
return target;
}
int main(){
string str;
cout << "请输入一个二进制数:" << endl;
cin >> str;
string target;
target = tranNum(str);
cout << "十六进制数为:" << target << endl;
}
输入:11110
输出:1E
十六进制转二进制
方法:与八进制转二进制类似,也是先将每一位十六进制数0~F所对应的二进制数放入一个数组中,然后对每一位十六进制数求得它所对应的二进制数,然后加到一起就可以了
数组:
string nums[]={"0000","0001","0010","0011","0100","0101","0110","0111",
"1000","1001","1010","1011","1100","1101","1110","1111"};
转换完成之后也是要删除多余的前导0
代码如下:
#include <bits/stdc++.h>
using namespace std;
//十六进制数0~F所对应的二进制数
string nums[]={"0000","0001","0010","0011","0100","0101","0110",
"0111","1000","1001","1010","1011","1100","1101","1110","1111"};
string tranNum(string &str){
string target;
for(int i = 0; i < str.length(); i++){
int x;
if(str[i] >= '0' && str[i] <= '9')
x = str[i] - '0';
else if(str[i] >= 'A' && str[i] <= 'F')
x = str[i] - 'A' + 10;
else if(str[i] >= 'a' && str[i] <= 'f')
x = str[i] - 'a' + 10;
target += nums[x];
}
//下面删除多余的前导0
int count = 0;
while(target[count] == '0')
count++;
target.erase(0,count);
return target;
}
int main(){
string str;
cout << "请输入一个十六进制数" << endl;
cin >> str;
string target = tranNum(str);
cout << "对应的二进制数为:" << target;
}
输入:F
输出:1111
八进制转十六进制
方法:把八进制数转换为二进制数,再把二进制数转换为十六进制数即可
代码如下:
#include <bits/stdc++.h>
using namespace std;
//八进制数0~7所对应的二进制数
string nums_8[]={"000","001","010","011","100","101","110","111"};
char compute(string &num){//返回每四位二进制所对应的十六进制数
char op;
int number=0;
for(int i = 0; i < num.size(); i++){
number = number*2 +num[i]-'0';
}
if(number<10)
op = '0' + number;
else//这一位十六进制就不是数字了,是个字母
op= number - 10 + 'A';
return op;
}
string tranNum8_2(string &str){//八进制转二进制函数
string target_2;
for(int i = 0; i < str.length(); i++){
int x = str[i]-'0';
target_2 += nums_8[x];
}
//下面删除多余的前导0
int count = 0;
while(target_2[count] == '0')
count++;
target_2.erase(0,count);
return target_2;
}
string tranNum2_16(string &target_2){//二进制转十六进制函数
int len = target_2.length();
if(len % 4 == 1)
target_2 = "000" + target_2;
else if(len % 4 == 2)
target_2 = "00" + target_2;
else if(len % 4 == 3)
target_2 = "0" + target_2;
string target_16;
for(int i = 0; i< target_2.length() - 1; i += 4){
string num = target_2.substr(i,4);
char op = compute(num);
target_16 = target_16 + op;
}
return target_16;
}
int main(){
string str;
cout << "请输入一个八进制数" << endl;
cin >> str;
string target_2 = tranNum8_2(str);
string target_16 = tranNum2_16(target_2);
cout << "对应的十六进制数为:" << target_16;
}
输入:1117
输出:24F
十六进制转八进制
方法:把十六进制数转换为二进制数,再把二进制数转换为八进制数
代码如下:
#include <bits/stdc++.h>
using namespace std;
//十六进制数0~F所对应的二进制数
string nums_16[]={"0000","0001","0010","0011","0100","0101","0110",
"0111","1000","1001","1010","1011","1100","1101","1110","1111"};
char compute(string &num){//返回每三位二进制所对应的八进制
char op;
int number=0;
for(int i = 0; i < num.size(); i++){
number = number*2 +num[i]-'0';
}
op = '0' + number;
return op;
}
string tranNum16_2(string &str){
string target;
for(int i = 0; i < str.length(); i++){
int x;
if(str[i] >= '0' && str[i] <= '9')
x = str[i] - '0';
else if(str[i] >= 'A' && str[i] <= 'F')
x = str[i] - 'A' + 10;
else if(str[i] >= 'a' && str[i] <= 'f')
x = str[i] - 'a' + 10;
target += nums_16[x];
}
//下面删除多余的前导0
int count = 0;
while(target[count] == '0')
count++;
target.erase(0,count);
return target;
}
string tranNum2_8(string &target_2){
int len = target_2.length();
if(len % 3 == 1)
target_2 = "00" + target_2;
else if(len % 3 == 2)
target_2 = "0" + target_2;
string target;
for(int i = 0; i< target_2.length() - 1; i += 3){
string num = target_2.substr(i,3);
char op = compute(num);
target = target + op;
}
return target;
}
int main(){
string str;
cout << "请输入一个十六进制数" << endl;
cin >> str;
string target_2 = tranNum16_2(str);
string target_8 = tranNum2_8(target_2);
cout << "对应的八进制数为:" << target_8;
}
输入:16A
输出:552