Java自学笔记系列十:小程序代码

 如题,题目要求编程实现十进制向二进制,八进制,十六进制的准换

 代码如下:

  
  
  
  
  1. /** 
  2.  *  
  3.  * @author TianHaoYu 
  4.  * 实现十进制到二进制,八进制,十六进制的转换 
  5.  * 依 int 类型数据作为示例 
  6.  * 
  7.  */ 
  8. public class ToBinaryOperate { 
  9.  
  10.   public static void transfor(int number,int base,int offSet){ 
  11.          
  12.     /*number 为 0 不做任何操作 */ 
  13.      if(number == 0){ 
  14.        System.out.println(number+"任意进制数值均为0!"); 
  15.        return;           
  16.      } 
  17.      char[] chars = { '0','1','2','3','4','5','6','7'
  18.                      '8','9','A','B','C','D','E','F' 
  19.              }; 
  20.    /*创建临时数组存储转化后的字符值*/ 
  21.    char[] arr = new char[32];  
  22.   /*记录arr中元素的位置*/ 
  23.    int index = arr.length;  
  24.    /*保留原始数值*/ 
  25.     int num = number; 
  26.  
  27.    /*实现进制之间的转换*/ 
  28.     while(number != 0){ 
  29.     int temp = number & base; // base 为进制的基值 可取的是: 1,07,0xF 
  30.        arr[--index] = chars[temp]; 
  31.        number =  number>>>offSet; // 右移的位数, 依次为: 1,3,4 
  32.    } 
  33.          
  34.    /*实现输出格式,用str来记录输出格式语句*/ 
  35.     String str = "十进制:"
  36.     switch(base){ 
  37.         case 1
  38.                str += (num + " 的二进制是:["); 
  39.                break
  40.         case 07
  41.                 str += (num + " 的八进制是:[O"); 
  42.                 break
  43.         case 0xF
  44.                 str += (num + " 的十六进制是:[0x"); 
  45.                     break
  46.         defaultbreak;      
  47.     } 
  48.          
  49.     /*格式化输出 arr中的值*/ 
  50.          
  51.     System.out.print(str); 
  52.     for(int x = index ; x < arr.length; x ++){ 
  53.          System.out.print(arr[x]); 
  54.     } 
  55.     System.out.println("]"); 
  56.      
  57.     /*十进制 ->二进制*/ 
  58.     static void toBinary(int number){ 
  59.      transfor(number, 11); 
  60.     } 
  61.      
  62.    /*十进制 ->八进制*/ 
  63.     static void toOctal(int number){ 
  64.      transfor(number, 073); 
  65.    } 
  66.     /*十进制->十六进制*/ 
  67.    static void toHex(int number){ 
  68.      transfor(number,0xF,4); 
  69.    } 
  70.      
  71. public static void main(String[] args) { 
  72.      /*测试实例*/ 
  73.      /*正数*/ 
  74.      System.out.println("============以下是正数的输出==========="); 
  75.         toBinary(45); 
  76.         toOctal(45); 
  77.         toHex(45); 
  78.      System.out.println("==============以下是0的输出==========="); 
  79.         /*零*/ 
  80.         toBinary(0); 
  81.         toOctal(0); 
  82.         toHex(0); 
  83.         /*负数*/ 
  84.     System.out.println("============以下是负数的输出==========="); 
  85.         toBinary(-45); 
  86.         toOctal(-45); 
  87.         toHex(-45); 
  88.          
  89.     } 

输出结果如下:
/*
============以下是正数的输出===========
十进制:45 的二进制是:[101101]
十进制:45 的八进制是:[O55]
十进制:45 的十六进制是:[0x2D]
==============以下是0的输出===========
0任意进制数值均为0!
0任意进制数值均为0!
0任意进制数值均为0!
============以下是负数的输出===========
十进制:-45 的二进制是:[11111111111111111111111111010011]
十进制:-45 的八进制是:[O37777777723]
十进制:-45 的十六进制是:[0xFFFFFFD3]
*/

 以上的版本是最终的版本且测试通过的,在这个代码的实现过程中其实是一步步来的.

   1,先写了一个十进制转换二进制的程序,输出格式和结果都不太理想,且还不能支持负数的输入.

   2,后先解决了十进制与二进制的转换.

   3,本打算用十进制数除于8或者16来完成操作,但仔细想,3位二进制可以表示为一个8进制,4位二进制可以表示为一个16进制.十进制的int类型在内存中是一个32位的二进制,就用移位和&操作.

   4,并且一个数的二进制位和 其他进制基数(当然他们也是二进制位)进行&操作,所得到的结果正好与chars数组中的每一个元素相对应.eg:

  25 &  0xF  ,过程如下:

第一步:

    25的二进制表达是: [0000-0000-0000-0000-0000-0000-0001-1001]

 &  0xF的二进制表达是:[0000-0000-0000-0000-0000-0000-0000-1111]

---------------------------------------------------------------------                                        [0000-0000-0000-0000-0000-0000-0000-1001]

  结果表示为十六进制就是:9

  第二步:

    接下来将25的二进制位右移4为:[0000-0000-0000-0000-0000-0000-0000-0001]

  &            0xF的二进制表达是:[0000-0000-0000-0000-0000-0000-0000-1111]

---------------------------------------------------------------------------

                                 [0000-0000-0000-0000-0000-0000-0000-0001]

 结果表示为十六进制就是:1

 第三步,再接着右移的话,全是25的高位上的0,没有操作意义,操作结束.

第四步:每一次&出的结果值,不管一位与否,chars[9] = 9 chars[1]=1

char[] chars = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };  

  所以 arr[--index] = chars[temp]   temp是在程序中保存 & 操作的结果的.  

  25的十六进制表达就是: 0x19

 转换为八进制原理亦如此。

  4, 原本程序中写了具有重复结构的三个转换函数 toBinary(),toOctal()和toHex(),觉得太过于繁琐,就抽取出来一个方法 transfor()来实现三者的共同处,在回调即可.

  大致思路就是这样吧.

 

本文出自 “IvanTian” 博客,转载请与作者联系!

你可能感兴趣的:(进制转换,思路,程序实践)