十进制转二进制的一种实现

来源:互联网 发布:加密软件破译 编辑:程序博客网 时间:2024/06/15 13:38
/*Binary Digit Translation*//*这个程序用于十进制数字到二进制数字的转换,使用的是字符串和数字的互相转化,具体使用规格说明如下:Type of Number: unsigned long 32bitsType of Strings: char *s[13]Cycle variable:unsigned int i,t*/ 


 

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>char bin[33]="00000000000000000000000000000000";int isnumerical(char *s)/*用于判断是否为数字的函数,0-非数字,1-数字*/{    unsigned int i,flag=1;/*flag为数字类型标识*/    if ((s[0]!='-')&&(s[0]<'0'||s[0]>'9')) flag=0;/*非数字*/    else    {        if (s[0]=='-') flag=1;/*负数*/        for (i=1;i<strlen(s);i++)/*从第二个字符开始验证是否为数字*/        if (s[i]<'0'||s[i]>'9')        {            flag=0;            break;        }    }    return flag;}void lowcase(char *s)/*将非数字的字符串统一转换成小写*/{     unsigned int i;     for (i=0;i<strlen(s);i++)     if (s[i]>='A'&&s[i]<='Z') s[i]+=32;}unsigned long e(unsigned int times)/*这个函数用来返回10^times*/{         unsigned int i;         unsigned long num=1;         if (times==0) return 1;         else          for (i=0;i<times;i++)         num*=10;         return num;}long val(char *s)/*这个函数实现字符串到数字的转换,返回数字部分,负数返回数字部分*/{         unsigned int i,len=strlen(s);         long num=0;         if (s[0]!='-')/*正数*/         for (i=0;i<len;i++) num+=(s[i]-'0')*e(len-i-1);         else /*负数*/         {              for(i=1;i<len;i++) num+=(s[i]-'0')*e(len-i-1);              num=-num;         }         return num;}char *D_B(long val) /*十进制转换成二进制,val-value*/{     char c;/*bin[]前32位为二进制,最后一位为'/0'*/     unsigned int i=0,t=0,len,ad=1;/*ad-进位*/     if (val==0) return bin;     if (val>0)/*正数*/     {        while (val!=0)        {              bin[i++]=val%2+'0';              val/=2;        }        //bin[i]='/0';        len=i-1;/*len下脚标恢复到'/0'之前的位置*/        for (i=0,t=len;i<t;i++,t--)        {            c=bin[i];            bin[i]=bin[t];            bin[t]=c;        }/*交换二进制字符串使得从0-len为正确的顺序*/        /*把数字部分移动到数组尾部*/        for (i=0;i<len+1;i++)        {            c=bin[31-i];            bin[31-i]=bin[len-i];            bin[len-i]=c;        }     }     else /*负数*/     {          /*负数部分还存在问题*/          bin[0]='1';/*负数为最高位为1,其他位为正数二进制取反加1*/          i=1;/*转换的数字要从第二个字符串开始*/          val=abs(val);          while (val!=0)          {                bin[i++]=val%2+'0';                val/=2;          }          len=i-1;/*len下脚标恢复到'/0'之前的位置*/          for (i=1,t=len;i<t;i++,t--)          {              c=bin[i];              bin[i]=bin[t];              bin[t]=c;          }/*交换二进制字符串使得从0-len为正确的顺序*/          /*把数字部分移动到数组尾部*/          for (i=0;i<len;i++)          {              c=bin[31-i];              bin[31-i]=bin[len-i];              bin[len-i]=c;          }          /*按位取反*/          for (i=1;i<32;i++)          {              if (bin[i]=='0') bin[i]='1';              else bin[i]='0';          }          /*再加一*/          for (i=31;ad!=0;i--)          {              if (bin[i]+ad>'1') bin[i]='0';/*需要进位*/              else              {                  bin[i]='1';/*前面有进位,此时可以推出s[i]=='0'*/                  ad=0;              }          }     }/*else 结束*/     return bin;}main(){      char s[14];      puts("This program is made for translate Decimal Digit to Binary Digit.");      puts("/"Exit/" for exit.");      putchar('/n');      puts("ATTENTION:");      puts("The number rangement:-2147483647~2147483647/n");      while (1)      {            printf(">>");            gets(s);            if (isnumerical(s))/*s是数字*/            {               putchar('/n');               printf("Binary Digit:");               puts(D_B(val(s)));               putchar('/n');            }            else            {                lowcase(s);                if (strcmp(s,"exit")!=0)                {                    puts("/nInvalid input.");                    puts("Only /"exit/" can exit this program./n");                }                else break;            }            strcpy(bin,"00000000000000000000000000000000");      }}


原创粉丝点击