进制转换专题
按位取值
十进制转二进制
//十进制转二进制
#include <iostream>
using namespace std;
void printBinary(int val);
int main()
{
int val;
cin >> val;
printBinary(val);
return 0;
}
void printBinary(int val)
{
int num[35];
int j = -1;
for (int i = 31; i >= 0; i--)
{
j++;
if (val & (1 << i)) // 1 << i 表示二进制 1 向左移动 i 位, & 为位运算符
//cout << "1";
//cin >> num[j];
num[j] = 1;
else
num[j] = 0;
}
int jBack = j;
int flag = 1; // 标记开头多余的0(不需要输出二进制开头的0)
for(j = 0; j <= jBack; j++){
if(flag == 1) {
if(num[j] == 0) continue;
else {
cout << num[j];
flag = 0;
}
}
else cout << num[j];
}
cout << endl;
}
输出结果
十进制转八进制
代码&注释
//十进制转八进制
#include <iostream>
#include <vector>
using namespace std;
int main()
{
cout << "Input a number:" << endl;
unsigned int d;
vector<int> ivec; // vector 一种容器,这里用来装 int 值
cin >> d;
int dBack = d; // 用来备份输入的 d
while (d)
{
ivec.push_back(d % 8); // 得到得值存到 ivec 中
d = d / 8; // d % 8 循环计算,依次得到对应的 8 进制值,然后通过计算 d / 8 计算下一位
}
if (dBack == 0) { // 当输入为 0 时执行的操作
cout << 0 << endl;
}
else {
cout << "The octal result is:" << endl;
for (vector<int>::iterator itr = ivec.end() - 1; itr >= ivec.begin();) // 遍历取出所有元素
{
cout << *itr--;
}
cout << endl;
}
return 0;
}
输出结果
十进制转多种进制
十进制转换为任意进制的源码
代码&注释
//十进制转换为任意进制的源码
#include <iostream>
using namespace std;
int main()
{
int n;
int num_sys, rem, m = 0, s[32];
cout << "输入要转换的数字:" << endl;
cin >> n;
cout << "输入要转换的进制:" << endl;
cin >> num_sys;
cout << "( " << n << " )10 = "
<< "( ";
while (n != 0) //数制转换,结果存入数组s[m]
{
rem = n % num_sys;
n = n / num_sys;
s[m++] = rem; //将余数按顺序存入数组s[m]中
}
m--;
for (int k = m; k >= 0; k--) //输出转换后的序列
{
if (s[k] >= 10) //若为十六进制等则输出相对应的字母
cout << (char)(s[k] + 55); // 10用A表示,A对应的ASCII值为65(等于55 + 10)
else //否则直接输出数字
cout << s[k];
}
cout << " )" << num_sys << endl;
return 0;
}
输出结果
用C++自带方法输出进制
代码&注释
#include <iostream>
#include <bitset> //输出二进制的头文件
using namespace std;
int main()
{
// cin >> oct >> test; //输入为八进制数
// cin >> hex >> test; //输入为十六进制数
int test;
cin >> test;
//cout << test << endl;
cout << "二进制: " << bitset<32>(test) << endl;
cout << "OCT: " << oct << test << endl; //八进制
cout << "HEX: " << hex << test << endl; //十六进制
cout << dec; //恢复十进制输出状态
cout << "DEC: " << test << endl;
return 0;
}
输出「浮点数」的进制转化
代码&注释
#include <iostream>
#include <cmath>
using namespace std;
void intPart(int dec_val, int n);
void floatPart(double dec_val, int n);
void intOrFloa(double dec_val, int n);
void toBOH(char ch[], double dec_val);
double toDec(char ch[], int n);
int main()
{
cout << " 进制转换\n";
char ch[100];
int n;
cout << "\n 输入整数,和它现在使用的进制: ";
cin >> ch >> n;
cout << endl;
toBOH(ch, toDec(ch, n)); // toDec 返回 10 进制值
return 0;
}
/*
十进制转换为二进制思想简述:
1.迭代到最底层,最底层的余数就是最高位,最底层没有余数;
2.依次往顶层递归,每一次的余数就是其底层的低位,其上层的高位;
3.调用进行到 if 选择输出,则那一次调用可以结束,逐阶往上层返回,并
进行上一层的输出语句,又一层调用结束,然后再往上返回,依次进行
*/
//转整数部分
void intPart(int dec_val, int n)
{
if (dec_val)
{
intPart(dec_val / n, n);
if (n < 10)
cout << dec_val % n;
else
dec_val % n >= 10 ? cout << char(dec_val % n - 10 + 'A') : cout << dec_val % n;
}
}
//转小数部分
void floatPart(double dec_val, int n)
{
while (dec_val)
{
if (n < 10)
cout << int(dec_val * n);
else
dec_val * n >= 10 ? cout << char(int(dec_val * n) - 10 + 'A') : cout << int(dec_val * n);
dec_val = dec_val * n - int(dec_val * n); // 得到的乘积减去整数部分,所的差赋值给 dec_val , 用于下一次循环
}
}
// 对整数或小数的操作(加小数点)
void intOrFloa(double dec_val, int n)
{
intPart(dec_val, n);
if (int(dec_val) == dec_val)
return;
cout << '.';
dec_val -= int(dec_val); // 得到小数部分
floatPart(dec_val, n);
}
// 输出三种进制
void toBOH(char ch[], double dec_val)
{
cout << ' ' << ch << " 转换成" << 2 << "进制 = ";
intOrFloa(dec_val, 2);
cout << endl;
cout << ' ' << ch << " 转换成" << 8 << "进制 = ";
intOrFloa(dec_val, 8);
cout << endl;
cout << ' ' << ch << " 转换成" << 16 << "进制 = ";
intOrFloa(dec_val, 16);
cout << endl;
}
// 对输入的数,进行得到10进制值的处理
double toDec(char ch[], int n)
{
char ch_cpy[100];
int i = 0, j;
double dec_val = 0;
cout << ' ' << ch << " 转换成10进制 = ";
while (*ch != '.' && *ch != '\0') // 读取到小数点,或者结束的位置
ch_cpy[i++] = *ch++;
i--;
if (*ch == '\0') // 如果有小数点,则读到了小数点的位置,这一步就不用执行
ch--;
// 计算整数部分
for (j = 0; j <= i; j++) // '.'为小数点,它的值为46
if (ch_cpy[j] < 65) // A 的值为 65, 当小于 65 时,可以判断该字符为小于 10 的数字字符
dec_val += (ch_cpy[j] - 48) * pow(n, i - j); // 0 的值为 48(得到对应的数字)(比如 '0' - 48 = 0)
else
dec_val += (ch_cpy[j] - 55) * pow(n, i - j); // 当字符的值大于等于55, 可以判断为大于10的进制的数字字符,相减得到对应的数
// 计算小数部分值(两部分的值加起来)
for (ch++, j = -1; *ch != '\0'; ch++, j--) // ch++ 越过小数点
if (*ch < 65)
dec_val += (*ch - 48) * pow(n, j);
else
dec_val += (*ch - 55) * pow(n, j);
cout << dec_val << endl;
return dec_val;
}
运行结果
总结
要学的东西很多,但是最重要的就是算法 和编程实践 oj,数学训练,加油,全力冲刺 AC, OJ, MATH!为金牌而战!!!