十进制数与二、八进制数互转

/*十进制数转换为二、八进制形式
 二、八进制形式转换为十进制数
*/

//头文件区
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值