/*十进制数转换为二、八进制形式
二、八进制形式转换为十进制数
*/
//头文件区
#include <iostream>
#include <bitset>
#include <cmath>
using namespace std;
//函数声明区
void DecToBinSigned(int n);
void DecToBinUnsigned(int n);
void DecToOctalSigned(int n);
void DecToOctalUnsigned(int n);
void BinToDecSigned();
void OctalToDecSigned();
int main()
{
system("color 0A");
int num,n;
cout<<" 系统功能说明: "<<endl;
cout<<"1)---有符号十进制数转化为二进制数 ;"<<endl;
cout<<"2)---无符号十进制数转化为二进制数 ;"<<endl;
cout<<"3)---有符号十进制数转化为八进制数 ;"<<endl;
cout<<"4)---无符号十进制数转化为八进制数 ;"<<endl;
cout<<"5)---无符号二进制数转化为十进制数 ;"<<endl;
cout<<"6)---无符号八进制数转化为十进制数 ;"<<endl;
cout<<"7)---退出系统。"<<endl;
do
{
cout<<endl;
cout<<"请输入您的选择:";
cin>>num;
while(num>8)
{
cout<<"对不起,您的输入有误,请重新输入!"<<endl;
cout<<"请输入您的选择:";
cin>>num;
}
switch(num)
{
case 1:
cout<<"请输入要转换的十进制数(-32768~32767):";
cin>>n;
DecToBinSigned(n);
break;
case 2:
cout<<"请输入要转换的十进制数(0~65536):";
cin>>n;
DecToBinUnsigned(n);
break;
case 3:
cout<<"请输入要转换的十进制数(-2097151~2097151):";
cin>>n;
DecToOctalSigned(n);
break;
case 4:
cout<<"请输入要转换的十进制数(0~16777215):";
cin>>n;
DecToOctalUnsigned(n);
break;
case 5:
BinToDecSigned();
break;
case 6:
OctalToDecSigned();
break;
case 7:
exit(0);
default:
break;
}
}while(num!=7);
return 0;
}
void DecToBinSigned(int n) //实现正负十进制转换为二进制
{
bitset<16> bit; //初始值全部为0
int i=0; //必须初始化,否则会出现内存无法访问的错误
if(n<0)
bit[15]=1; //负数最高位置1
cout<<n<<" 二进制为:";
n=fabs(n); //取绝对值计算
while(n!=0)
{
if(n%2==1) //n对2取余
{
bit[i++]=1;
n=(n-1)/2;
}
else
{
bit[i++]=0;
n=n/2;
}
}
for(int k=15;k>=0;k--)
{
cout<<bit[k];
if(k%8==0)
cout<<" ";
}
cout<<endl;
}
void DecToBinUnsigned(int n) //实现正十进制转换为二进制
{
bitset<16> bit; //初始值全部为0
int i=0; //必须初始化,否则会出现内存无法访问的错误
while(n!=0)
{
if(n%2==1)
{
bit[i++]=1;
n=(n-1)/2;
}
else
{
bit[i++]=0;
n=n/2;
}
}
cout<<n<<" 二进制为:";
for(int k=15;k>=0;k--)
{
cout<<bit[k];
if(k%8==0)
cout<<" ";
}
cout<<endl;
}
void DecToOctalSigned(int n) //实现正负进制转换为八进制(-2097151~2097151)
{
int otc[8]={0}; //初始值全部为0
int i=0; //必须初始化,否则会出现内存无法访问的错误
if(n<0)
otc[7]=1; //负数最高位置1
cout<<n<<" 八进制为:";
n=fabs(n);
while(n!=0)
{
if(n%8==0) //n对8取余为0,则该位为0
{
otc[i++]=0;
n=n/8;
}
else //n对8取余非0,则该位为取余所得的值
{
int k=n%8;
otc[i++]=k;
n=(n-k)/8;
}
}
for(int k=7;k>=0;k--)
{
cout<<otc[k];
}
cout<<endl;
}
void DecToOctalUnsigned(int n) //实现正十进制转换为八进制(0~16777215)
{
int otc[8]={0}; //初始值全部为0
int i=0; //必须初始化,否则会出现内存无法访问的错误
while(n!=0)
{
if(n%8==0)
{
otc[i++]=0;
n=n/8;
}
else
{
int k=n%8;
otc[i++]=k;
n=(n-k)/8;
}
}
cout<<n<<" 八进制为:";
for(int k=7;k>=0;k--)
{
cout<<otc[k];
}
cout<<endl;
}
void BinToDecSigned()
{
int i=0,sum=0;
char c; //以字符输入,否则输入10是十而非二进制10
int intArray[16]={0};
cout<<"请输入二进制数(0~16位 以'b'结束输入):";
while(cin>>c&&c!='b') //循环输入
{
intArray[i++]=c-'0'; //将输入的字符转化为相应的数字
}
int k=i-1;
for(i=0;i<=k;i++)
if(intArray[i]==1)
sum+=pow(2,k-i); //由于二进制的特殊性,只处理值为1的位,
//将其对应的十进制数累加
for(i=0;i<=k;i++)
cout<<intArray[i];
cout<<" 十进制数为"<<sum<<endl;
}
void OctalToDecSigned()
{
int i=0,sum=0;
char c;
int intArray[16]={0};
cout<<"请输入八进制数(0~16位 以'o'结束输入):";
while(cin>>c&&c!='o')
{
intArray[i++]=c-'0'; //将输入的字符转化为相应的数字
}
int k=i-1;
for(i=0;i<=k;i++)
sum+=pow(8,k-i)*intArray[i]; //处理i位数字intArray[i]对应的十进制数累加
for(i=0;i<=k;i++)
cout<<intArray[i];
cout<<" 十进制数为"<<sum<<endl;
}