二进制,八进制,十进制,十六进制转换

作者在 2010-10-23 18:34:35 发布以下内容
因为要学习汇编,里面要频繁的用到进制的转换,所以,用了一个下午,编写了个进制转换的小程序。虽然不是很难,但是很麻烦,很费力。还算是比较满意,所以把源码贴出来了。
#include "stdio.h"
#include <math.h>
#include <stdlib.h>
#include <string.h>
void d_b(int num);
void b_d(char *b);
void b_o(char *b);
void b_h(char *b);
void b_t(char *b);
void o_b(int num);
void h_b(int num);
void help();
void main()
{
    char b[256];
    int num;
    char c;
    help();
    for(;;)
    {
       fflush(stdin);
       scanf("%c",&c);
       switch(c)
       {
           case 'a': scanf("%d",&num); d_b(num);break;
           case 'b': scanf("%s",b);    b_d(b);  break;
           case 'c': scanf("%s",b);    b_t(b);  break;
           case 'd': scanf("%d",&num); printf("十六进制:%x\n",num);  break;
           case 'e': scanf("%d",&num); printf("八进制:%o\n",num);  break;
           case 'f': scanf("%o",&num); printf("十进制:%d\n",num);  break;
           case 'g': scanf("%x",&num); printf("十进制:%d\n",num);  break;
           case 'h': scanf("%x",&num); h_b(num);  break;
           case 'i': scanf("%o",&num); o_b(num);  break;
           case 'j': scanf("%s",b);    b_o(b);  break;
           case 'k': scanf("%s",b);    b_h(b);  break;
           case 'l': scanf("%o",&num); printf("十六进制:%x\n",num);  break;
           case 'm': scanf("%x",&num); printf("八进制:%o\n",num); break;
           case 'r': system("CLS"); help(); break;
           case 'q': return 0;
           default:printf("格式输入错误!\n");break;
       }
    }
    
}
void d_b(int num)  /*十进制转二进制*/
{
    int t,i=0,c=1;
    int s[256];
    while(num)
    {
        s[i]=num%2;
        num/=2;
        i++;
    }
    t=i;
    printf("二进制:");
    while(i%8!=0) /*前补0*/
    {
        printf("%d",0);
        i++;
        c++;
    }
    for(t--;t>=0;t--,c++)
    {
        printf("%d",s[t]);
        if(c%8==0&&t!=0) printf(",");     /*每八位用,隔开*/
    }    
    printf("\n");
}
void b_d(char *b)
{   /*二进制转十进制*/
    int len=strlen(b);
    int i,j,sum=0;
    for(i=0,j=len-1;i<len;i++,j--)
    {
        sum=pow(2,i)*(b[j]-'0')+sum;
    }
    printf("十进制:%d\n",sum);
}
void o_b(int num)
{  /*八进制转二进制*/
   d_b(num);
}    
void h_b(int num)
{  /*十六进制转换二进制*/;
    d_b(num);
}
void b_o(char *b)
{    /*二进制转八进制*/
    int len=strlen(b);
    int i,j,sum=0;
    for(i=0,j=len-1;i<len;i++,j--)
    {
        sum=pow(2,i)*(b[j]-'0')+sum;
    }
    printf("八进制:%o\n",sum);    
}
void b_h(char *b)
{    /*二进制转十六进制*/
    int len=strlen(b);
    int i,j,sum=0;
    for(i=0,j=len-1;i<len;i++,j--)
    {
        sum=pow(2,i)*(b[j]-'0')+sum;
    }
    printf("十六进制:%x\n",sum);    
}

void b_t(char *b)
{  /*二进制负数求补码*/
    int len=strlen(b);
    int i,c=0,carry=1;   /*c用于格式控制,每八位输出一个','*/
    for(i=len-1;i>=0;i--)
    {
        b[i]=!((b[i]-'0')&&1)+carry;
        if(b[i]==2) {b[i]=0; carry=1;}
        else carry=0;
    }
    if(carry==1) c++;      /*如果最高位还有进位*/
    i=len+c;
    printf("二进制补码:");  
    while(i%8!=0) /*不足八位,前补0*/
    {
        printf("%d",0);
        i++;
        c++;
    }
    if(carry==1) printf("1");
    if(c%8==0&&c!=0) printf(",");
    for(i=0;i<len;i++)
    {
        printf("%d",b[i]);
        c++;
        if(c%8==0&&i!=len-1) printf(",");     /*每八位用,隔开*/
    }        
    printf("\n");
}
void help()
{
    printf("欢迎使用进制转换程序\n");
    printf("j:二进制转换八进制\ti:八进制转二进制\ta:十进制转换二进制\n");
    printf("b:二进制转十进制\tf:八进制转十进制\te:十进制转八进制\n");
    printf("k:二进制转十六进制\tl:八进制转十六进制\td:十进制转十六进制\n");
    printf("h:十六进制转二进制\tm:十六进制转八进制\tg:十六进制转十进制\n");
    printf("c:二进制负数补码\tr:清理屏幕\tq:退出\n");
    printf("命令格式为:“命令+待转换数字”,例如将十进制数9转换为二进制数,输入“a9”,得到00001001。\n");
    printf("---------------------------------------------------------------------\n");
    printf("作者:Outsider\t                            2010年10月23日\n");
}
作品源码 | 阅读 1957 次
文章评论,共4条
NoSoul
2010-10-30 08:19
1
你可以写一个函数 char fun(char *num,int a,int b) 这样一个函数就能代替你的那么多函数。还有都学了很久了吧,还#include &quot;stdio.h&quot; 这样写?
outsider_scu(作者)
2010-10-30 21:30
2
<div class="quote"><span class="q"><b>NoSoul</b>: 你可以写一个函数 char fun(char *num,int a,int b) 这样一个函数就能代替你的那么多函数。还有都学了很久了吧,还#include &quot;stdio.h&quot; 这样写?</span></div>高手。。<br />
听君一眼,获益匪浅呀。。<br />
实不相瞒,因为编这个之前好久都没有写过程序了。<br />
所以用一下午写下这个还有点沾沾自喜。现在感觉确实挺垃圾的。。。
cnfarer
2010-11-26 14:50
3
太长了吧?
outsider_scu(作者)
2010-11-27 19:28
4
<div class="quote"><span class="q"><b>cnfarer</b>: 太长了吧?</span></div>恩。我都不相信这是我写的,现在看起来是这么烂
游客请输入验证码
文章归档