黑马程序员技术交流社区

标题: 帮忙看分析下两个实现同种功能的代码,那个效率高点 [打印本页]

作者: U芽Lady    时间: 2013-4-9 22:04
标题: 帮忙看分析下两个实现同种功能的代码,那个效率高点
本帖最后由 U芽Lady 于 2013-4-10 21:36 编辑

//十进制转换成二进制,八进制,十六进制
class Shi {
public static void main(String[] args) {
  fun1(60,15,4);
  String s = fun2(60,16);
  System.out.print(s);
}

public static void fun1(int num,int j,int k){
  char[] c1 = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};//查表
  //定义字符串接收转换后的值
  char[] c2 = new char[32];
  //定义一个指针
  int pos = c2.length-1;
  //遍历
  while(num != 0){
   int x = num & j;//与上个进制中的最大值
   c2[pos] = c1[x];//把这个地址对应的值付给c2
   num = num >>> k;//控制循环
   pos--;//指针移动
  }
  //遍历输出
  for (int y = pos;y < c2.length ;y++ ){
   System.out.print(c2[y] + " ");
  }
}
//这是我自己想的
public static String fun2(int i,int j){
  char[] c1 = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};//查表
  String s = "";//定义一个字符串接收计算值
  for (;i != 0; i = i / j){
   int x = i % j;//进制取余   
   s = c1[x] + s;//返回值     
  }
  return s;  
}
}


各位大神帮忙分析一下,在此谢过,我感觉我写的么啥问题,还很简单易懂

作者: 通行天下    时间: 2013-4-9 22:56
高啊!!{:soso_e179:}
作者: 赵崇友    时间: 2013-4-9 22:58
  1. //十进制转换成二进制,八进制,十六进制
  2. class Shi {
  3. public static void main(String[] args) {
  4.   fun1(60,15,4);
  5.   String s = fun2(60,16);
  6.   System.out.print(s);
  7. }

  8. public static void fun1(int num,int j,int k){
  9.   char[] c1 = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};//查表
  10.   //<STRONG>定义字符数组接收转换后的值
  11. </STRONG>  char[] c2 = new char[32];
  12.   //<STRONG>定义一个int型变量记录数组的位置角标
  13. </STRONG>  int pos = c2.length-1;
  14.   //遍历
  15.   while(num != 0){
  16.    int x = num & j;//与上个进制中的最大值
  17.    c2[pos] = c1[x];//把这个地址对应的值付给c2
  18.    num = num >>> k;//控制循环
  19.    pos--;//指针移动
  20.   }
  21.   //遍历输出
  22.   for (int y = pos;y < c2.length ;y++ ){
  23.    System.out.print(c2[y] + " ");
  24.   }
  25. }
  26. //这是我自己想的
  27. public static String fun2(int i,int j){
  28.   char[] c1 = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};//查表
  29.   String s = "";//定义一个字符串接收计算值
  30.   for (;i != 0; i = i / j){
  31.    int x = i % j;//进制取余   
  32.    s = c1[x] + s;//返回值     
  33.   }
  34.   return s;  
  35. }
  36. }



  37. 楼主的代码效率没有上面的高,因为运算在计算机内部运行都是二进制形式的,除法要进行多次运算,而位移运算符只需一次。可以看看计算机组成原理运算器那一章就明白了。楼主不懂的话,可以追问。
复制代码

作者: U芽Lady    时间: 2013-4-9 23:04
赵崇友 发表于 2013-4-9 22:58

谢谢,但是他有很多次的指向啊,那个数组的
作者: 胡峰    时间: 2013-4-9 23:23
楼主 一种是while循环  另一种是for循环.
我个人感觉for循环效率点,
在功能上当for循环  循环后就消失了,节省空间.
while 循环还要等到这个类使用完后才能消失.
所以我个人感觉for循环跟效率.
作者: 赵崇友    时间: 2013-4-10 18:13
U芽Lady 发表于 2013-4-9 23:04
谢谢,但是他有很多次的指向啊,那个数组的

你说的是那个pos指针移动嘛?它是为了后面遍历提高效率的!再说你那个i%j也是每次循环都要做一次的。总的来说还是上面那个效率高些。再细节就是计算机内部的东西了,不必深究。以后还会遇到的。到学到容器的时候,还有更高效的方法。上面定义的接收结果的数组char[]c2是固定长度的,有点浪费内存的。后面会讲到。
作者: U芽Lady    时间: 2013-4-10 21:37
赵崇友 发表于 2013-4-10 18:13
你说的是那个pos指针移动嘛?它是为了后面遍历提高效率的!再说你那个i%j也是每次循环都要做一次的。总的 ...

谢谢,了解了




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