黑马程序员技术交流社区

标题: 说一说进制转换 [打印本页]

作者: 邓士林    时间: 2015-1-20 11:25
标题: 说一说进制转换
十进制与二进制的转换分析:(小数部分另谈)
思路:
利用辗转相除法不断除以2,求余数,然后将余数倒着打印即可。
例如:将十进制的168转换为二进制,(10101000)2
分析:第一步,将168除以2,商84,余数为0。
第二步,将商84除以2,商42余数为0。
第三步,将商42除以2,商21余数为0。
第四步,将商21除以2,商10余数为1。
第五步,将商10除以2,商5余数为0。
第六步,将商5除以2,商2余数为1。
第七步,将商2除以2,商1余数为0。
第八步,将商1除以2,商0余数为1。
第九步,读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,即10101000
通过以上例子,可以发现,通过辗转相除法可以讲十进制转换为二进制。
  1.         public static void converBinary(int value)
  2.         {
  3.                 StringBuilder sb = new StringBuilder();
  4.                 while(value)
  5.                 {
  6.                         int t = value % 2;
  7.                         char chTemp;  
  8.                         if(t>=0 && t<=9)  
  9.                         {  
  10.                                 chTemp = (char)(t + '0');  
  11.                         }
  12.                         sb.append(chTemp);
  13.                 }

  14.                 System.out.println("二进制:" + sb.reverse());
  15.         }
复制代码



那么,如果我们通过二进制怎么转换为十进制呢?
  1. public static int convertDecimal(String svalue)
  2.         {
  3.                 int num =0,t = 0;
  4.                 char [] ch =svalue.toCharArray();
  5.                 for(int i=0;i<ch.length;i++)
  6.                 {
  7.                         if(ch[i] >= '0' && ch[i] <= '9')
  8.                         {
  9.                                 t = ch[i] - '0';
  10.                         }

  11.                         num = num *2 +t;                //二进制,基数乘以2
  12.                 }
  13.                 return num;
  14.         }
复制代码

既然我们有上面的互相转换代码,我们就可以写出十进制与二进制之间的相互转换功能,那么二进制、八进制、十六进制、十进制之间如何相互转换呢,参照以上思路我们可以写出。
  1. public static StringBuilder convert(String srcValue,int srcHex,int tarHex)
  2.         {
  3.                 int num =0;
  4.                 int t = 0,i=0;
  5.                 char[] ch = srcValue.toCharArray();
  6.                 for(;i<ch.length;i++)
  7.                 {
  8.                         if(ch[i]>='0' && ch[i]<='9')
  9.                         {
  10.                                 t = ch[i] - '0';
  11.                         }
  12.                         else if(ch[i] >= 'A' && ch[i] <= 'F')
  13.                         {
  14.                                 t = ch[i] - 'A' + 10;
  15.                         }

  16.                         num = num * srcHex + t;
  17.                 }

  18.                 i = 0;
  19.                 StringBuilder sb = new StringBuilder();
  20.                 while(num != 0)
  21.                 {
  22.                         t = num % tarHex;
  23.                         char chTemp;
  24.                         if(t>=0 && t<=9)
  25.                         {
  26.                                 chTemp = (char)(t + '0');
  27.                         }
  28.                         else
  29.                         {
  30.                                 chTemp = (char)(t - 10 + 'A');
  31.                         }
  32.                         sb.append(chTemp);
  33.                         num /= tarHex;
  34.                 }
  35.                 return sb;
  36.         }
复制代码
总结:
进制转换中我们可以巧妙利用StingBuilder来实现反转,避免了遍历数组的倒序输出。
另附以为哥们的代码,供大家学习。
  1.      //下面这三个方法分别转换成相应的进制。
  2.         public static void toBin(int num,int x)
  3.         {
  4.                 System.out.print("您输入的"+x+"进制数的二进制形式是:");
  5.                 trans(num,1,1);
  6.         }
  7.         public static void toOct(int num,int x)
  8.         {
  9.                 System.out.print("您输入的"+x+"进制数的八进制形式是:");
  10.                 trans(num,7,3);
  11.         }
  12.         public static void toHex(int num,int x)
  13.         {
  14.                 System.out.print("您输入的"+x+"进制数的十六进制形式是:");
  15.                 trans(num,15,4);
  16.         }
  17.         
  18.         

  19.         //trans():上边三个进制转换函数调用这个方法就可以完成进制的转换。
  20.         public static void trans(int num, int base, int offset)
  21.         {
  22.                 if(num == 0)
  23.                 {
  24.                         System.out.println(0);
  25.                         return;
  26.                 }

  27.                 char[] chs = {'0','1','2','3',
  28.                                         '4','5','6','7',
  29.                                         '8','9','A','B',
  30.                                         'C','D','E','F'};

  31.                 char[] arr = new char[32];

  32.                 int pos = arr.length;

  33.                 while(num != 0)
  34.                 {
  35.                         int temp = num & base;
  36.                         arr[--pos] = chs[temp];
  37.                         num = num >>> offset;
  38.                 }

  39.                 for(int i = pos; i < arr.length; i++)
  40.                 {
  41.                         System.out.print(arr[i]);
  42.                 }
  43.                 System.out.println();
  44.                 System.out.println();
  45.         }
复制代码





10.png (5.76 KB, 下载次数: 14)

10.png

QQ截图20150119161340.png (82.07 KB, 下载次数: 15)

QQ截图20150119161340.png

作者: 邓士林    时间: 2015-1-20 11:26
论坛中的图片,为什么不能放在指定的位置,而是添加到附件,放在最后呢?很不方便啊
作者: fanshuai    时间: 2015-1-20 11:56
还没学到这里呢,呵呵。:lol




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2