N进制转换(C语言)

N 进制转换(C语言)

二个函数就能解决进制转换,最直捷计算的进制转换方式。
在玩编程的时候常会碰到十六进制转换的问题。对于专业的大佬大咖这不是问题,小人物总会有些麻烦。我在研究调色板时也遇到进制转换问题。
进制转换是程序设计的基本算法,前些时写了十进制和十六进制转换的博文,今再写此篇关于N进制转换的博文,此文是最简洁简练的进制互转方法,就二个函数。供大家参考,希望大家喜欢。

3b2ed5f06309458e9857a69447b4969b.png

 

以下是源码:
//***********  N 进制转换  ****************
// 本代码是用简单的 C 语言写的,用 MySpringC
//  v2.7 编译调试通过。可以 VB6, VC, Java 改写。
// 编译人:张纯叔(micelu@126.com )
//***************************************
//全局变量:
 string sBarDes[8];    //菜单按钮
 int nBarId[8];
 int dec, sd ;            //十进制
 int nn, N;          //nn输入设置,转N=2,8,16进制
 string hx$ ;      //N进制值字符表
 int  i, j, kn, k ;          //计算
 double m ;              //计算
 string get$ ;            //输入
 string a$ ;               //计算
 string output$;      //输出结果
 int nlen ;                 //Len 字数
 string bin, oct, hex ;    //n 进制输出

main(){
setDisplay (0);
 //菜单按钮输入选项
   sBarDes[0]="输入 2 >>";
   nBarId[0]=100;
   sBarDes[1]="输入 8 >>";
   nBarId[1]=101;
   sBarDes[2]="输入 10 >>";
   nBarId[2]=102;
   sBarDes[3]="输入 16 >>";
   nBarId[3]=103;
   sBarDes[4]="退出程序";
   nBarId[4]=104;
   sBarDes[5]="。。。";
   nBarId[5]=105;
   setToolBarHeight(10);
   setButtonTextSize(12);
  setToolBarBackgroundColor(255,220,220,220);
   setButtonColor(255,240,240,240);
   setButtonTextColor(255,0,0,200);
   setToolBar(100,myToolBarProc,sBarDes,nBarId,6);
   setTitle("N 进制转换"); 
//****
     print "输入:二,八,十,十六进制数  " ;
     print "一个输入 >> 计算 >> 转换输出四类进制数 " ;
  while (){}
}//main ()

81d5a6d8556c415a83c69cfbc17e9039.png

69917b1b94a14822b802ad9642c65258.png 

810950a1d47f42a988a61edd445dd1bd.png 

 

//二个函数解决 nn >> N 进制转换:
// decToN ( ) :十进制转 2、8、16进制
// nnToDec ( ) :  2、8、16 转十进制
//最大输入可计算值:
// 二进制:  1111111111111111111111111111111 
// 八进制:  2147483647
// 十进制:  17777777777 
// 十六进制:  7fffffff
//输入超值和非格式时计算会出错,不会意外中断程序。输入格式检验没写。

decToN (){
 //*  input dec  return  Bin Oct Hex = output$
 //传入十进制整数int dec,
//一个预设置字符表hx$就可完成三类N进制的转换。N=2, 8, 16 
 //最大十进制可计算值 2,147,483,647
        hx$="0123456789ABCDEF" ;
        sd=dec ;     //保持 dec 原值,再计算
        output$=" ";     //init输出

 while (dec != 0){
  //** do calculate until dec=0, return output$
      k=dec-dec/N*N ;    //取余,k=dec Mod N
      dec=dec/N ;            //整除,dec\N
      output$=subString (hx$, k,1)+output$ ;     }
  //****** 计算就如此简单 *******

     //输出结果:
      if (N==2)  bin = output$ ;
      if (N==8)  oct = output$ ;
      if (N==16) hex = output$ ;
      dec=sd ;    //还原 dec > 再计算
}//decToN ()

nnToDec (){  
//传入 nn 进制数 >> 转换为十进制数
//stringInput() 传入 string  get$ 输出 int dec 
//nn 输入二,八,十六进制数 > 计算 nn^kn 次方
        nlen=len (get$);      //字串长度
        dec=0 ;                 //init 置初值 0
 //开始计算 >
      for (i=0; i<nlen; i++){
             a$=subString (get$, i, 1);
 //字符串转为数值的方法很多,我采用最简单直观的写法,字母大小写都可以。多人采用个位起反向计算十进制数,我的方法是高权位起降幂计算乘方累加。此方法就一个计算式,简单直观,方便使用。
        if (a$=="0") k=0 ;
        if (a$=="1") k=1 ;
        if (a$=="2") k=2 ;
        if (a$=="3") k=3 ;
        if (a$=="4") k=4 ;
        if (a$=="5") k=5 ;
        if (a$=="6") k=6 ;
        if (a$=="7") k=7 ;
        if (a$=="8") k=8 ;
        if (a$=="9") k=9 ;
        if (a$=="A"||a$=="a") k=10 ;
        if (a$=="B"||a$=="b") k=11 ;
        if (a$=="C"||a$=="c") k=12 ;
        if (a$=="D"||a$=="d") k=13 ;
        if (a$=="E"||a$=="e") k=14 ;
        if (a$=="F"||a$=="f") k=15 ;
   //****** 计算就如此简单 *******
         kn=nlen-i-1 ;     //高权位起降幂计算
         dec=dec+(int)(k*pow(nn, kn)) ;   //乘方累加
              }       // return dec
 }//nnToDec ()

c573dd2a503e4b2e904db9913bc32449.png

787906e5f251417f920c4a24447a1e79.png 

 

//测试转换 nn_Input ( ) 
//用此二个函数可各进制互转
//输入nn进制数,一次计算,显示四个进制结果

nn_Input (){
//最大输入可计算值:
// 二进制:  1111111111111111111111111111111 
// 八进制:  2147483647
// 十进制:  17777777777 
// 十六进制:  7fffffff
//输入超值和非格式时计算会出错,
//不会意外中断程序。

//输入 nn 选项:
    clearOutput () ;
    print "输入:二,八,十,十六进制数  " ;
    print "一个输入 >> 计算 >> 转换输出四类进制数 " ;
    print "  " ;

//输入二,八,十六进制数
    if (nn==2||nn==8||nn==16){
    get$=stringInput (" 输入二,八,十六进制数 ","     例:1011 , 377 ,  26bF  \n            输入 [ 空 ]  退出 " ) ;
    if (get$==" ") {  
         print "输入为空,请重新输入。 "  ;     }            
    if (nn==2){
         bin=get$ ;  
         print "输入:二进制 Bin = ", get$ ;  }
    if (nn==8){ 
         oct=get$;  
         print "输入:八进制 Oct = ", get$ ;  }
    if (nn==16){
         hex=get$ ; 
         print "输入:十六进制 Hex = ", get$ ;  }
              } // 输入 nn = 2,8,16 >> 

//输入十进制数
    if (nn==10){
    m=doubleInput (" 输入十进制非负整数 ","     例: 16777215  \n            输入 [ 空 ]  退出 " ) ;
    if (m==0) {   print "输入为空,请重新输入。 "  ;     }
        dec=(int)(m);
        print "输入:十进制 Dec = ", dec;      }

//一个输入,四类进制计算 >> 转换 >> 输出结果
    if (nn==2){
         nnToDec () ;
         N=8 ;  decToN () ;
         N=16 ;  decToN () ;      }

     if (nn==8){
          nnToDec () ;
          N=2 ;  decToN () ;
          N=16 ;  decToN () ;      }

     if (nn==10){
         N=2 ;  decToN () ;
         N=8 ;  decToN () ;
         N=16 ;  decToN () ;      }

      if (nn==16){
          nnToDec () ;
          N=2 ;  decToN () ;
          N=8 ;  decToN () ;      }

//打印计算结果:
  print "  " ;
  print "计算结果:  " ;
  print "    二进制: Bin = " , bin ;
  print "    八进制: Oct = " , oct ;
  print "    十进制: Dec = " , dec ;
  print "十六进制: Hex = " , hex ;

}//nn_Input ()

myToolBarProc(int nBtn,int nContext) {
      if(nBtn==100){  //输入nn2 >>
           nn=2 ;  nn_Input ();       
                        }
      if(nBtn==101){  //输入nn8 >>
           nn=8 ;  nn_Input ();       
                        }
       if(nBtn==102){  //输入nn10 >>
           nn=10 ;  nn_Input ();       
                        }
      if(nBtn==103){  //输入nn16 >>
            nn=16 ;  nn_Input ();       
                        }
      if(nBtn==104){//退出程序
          clearOutput();
          exit (0);     
                        }
      if(nBtn==105){//清屏
          clearOutput();    
                        }
}//myToolbar ()

 

//****End****

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值