A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周博文 中级黑马   /  2015-7-11 21:13  /  414 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

前两天在论坛看到一个同学编写了进制转换程序,在看懂他的代码之后,我自己进行了修改,并且添加了详细的注释,希望能和大家交流一下。
  1. /*
  2.         需求:用户输入一个十进制的数和想要转换的进制,
  3.                  输出转换后的结果

  4.         分析:十进制转换成 2 8 16进制的方式:
  5.         二进制:
  6.                  number >>> 0 & 1(2-1) --> 2的0次方位
  7.                  number >>> 1 & 1(2-1)--> 2的1次方位
  8.                  ...
  9.         八进制:
  10.                  number >>> 0 & 7(8-1)--> 8的0次方位
  11.                  number >>> 3 & 7(8-1)--> 8的1次方位
  12.         十六进制:
  13.                  number >>> 0 & 15(16-1)--> 16的0次方位
  14.                  number >>> 4 & 15(16-1)--> 16的1次方位
  15.         由于2,8,16进制的某一位的值最大为 16,且规定用户输入的数据
  16.         不超过int的最大范围 32 位,所以用一个byte[32] result来存储
  17.         转换后的值

  18.        

  19.         步骤:编写一个方法:用于将一个十进制整数转换为2,8,16进制的值
  20.                  返回值类型: char[] result
  21.                  参数列表: int number 用户输入的十进制数
  22.                                    int target 用户要进行转换的目标进制(2,8,16中的一种)
  23.                                   
  24.                  1.定义一个char[] search = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}
  25.                    用于采用查表法确定转换后每一位十进制数对应的其他进制的值
  26.                  2.定义一个整数用于存储进制转换所需要移位的次数,根据进制不同赋予不同的值(二进制1,八进制3,十六进制4)
  27.                                 int moveNum;
  28.                  3.target - 1为 进行&运算需要的值
  29.                  4.循环对number进行转换,每次循环取得转换后的值其中一位,从最低位开始
  30.                         循环结束条件:当number 移位后的值为0
  31.                         用变量记录结束循环时的数值
  32. */
  33. import java.util.Scanner;

  34. class ConvertDemo {
  35.         public static void main(String[] args) {
  36.                 Scanner sc = new Scanner(System.in);
  37.                 System.out.println("请输入一个十进制整数:");
  38.                 int number = sc.nextInt();
  39.                 System.out.println("希望将该整数转换为的进制是(2,8,16):");
  40.                 int target = sc.nextInt();
  41.                
  42.                 char[] result = convert(number, target);
  43.                 int end = 0;
  44.                 while (result[end] != '\n'){
  45.                         end++;
  46.                 }
  47.                 //由于返回的数组为结果的逆序,故应该逆序打印出结果
  48.                 for (int i=end-1; i>=0 ; i--){
  49.                         System.out.print(result[i]);
  50.                 }

  51.                 System.out.println();
  52.         }

  53.         public static char[] convert(int number, int target){
  54.                 //定义一个char数组用于存储转换后的结果
  55.                 char[] result = new char[32];
  56.                 //定义一个数组用于查找各个位对应的转换后的值
  57.                 char[] search = {'0', '1', '2', '3', '4', '5', '6', '7',
  58.                                                  '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
  59.                 int moveNum = 0;
  60.                 int baseNum = target - 1;
  61.                
  62.                 switch (target){
  63.                         case 2:
  64.                                 moveNum = 1;
  65.                                 break;
  66.                         case 8:
  67.                                 moveNum = 3;
  68.                                 break;
  69.                         case 16:
  70.                                 moveNum = 4;
  71.                                 break;
  72.                         default:
  73.                                 System.out.println("该程序仅用于将十进制转换为二,八,十六进制");
  74.                                 break;
  75.                 }

  76.                 int location = 0;
  77.                 do{
  78.                         result[location] = search[number & baseNum];
  79.                         number = number >>> moveNum;
  80.                         location++;
  81.                 }
  82.                 while (number != 0);
  83.                 //用于判断转换后数值的结尾
  84.                 result[location] = '\n';

  85.                 return result;
  86.         }
  87. }
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马