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