黑马程序员技术交流社区

标题: 转16进制问题 [打印本页]

作者: 彭刚    时间: 2013-12-4 11:39
标题: 转16进制问题
为什么结果多个0、、、
class arr
{
public static void main(String[] args)
{
  toHex_1(60);
}
public static void toHex_1(int num)
{
  //进制转换10--16
  StringBuffer sb = new StringBuffer();
  int temp=1;
  while(temp!=0)
  {  
  //System.out.println(num&15);
  temp = num&15;
  if(temp>9)
   sb.append((char)(temp-10+'a'));
  else
   sb.append(temp);
  num = num>>>4;  
  }
  System.out.println(sb.reverse());
}
}

作者: 天ya~_琼楼    时间: 2013-12-4 12:28
在while循环时,判断temp!=0,判断的是上次循环得到的temp,因此符合条件可以再循环一次,但是这次循环得出的temp=0,然后终止循环,打印结果。
比如60&15,转化为二进制
   0000-0000 0000-0000 0000-0000 0011-1100
&0000-0000 0000-0000 0000-0000 0000-1111
得出结果为1111,temp不为0,即c,继续循环
然后60>>4,再&15
  0000-0000 0000-0000 0000-0000 0000-0011
&0000-0000 0000-0000 0000-0000 0000-1111
结果0011,不为0,即3,继续循环
再右移4位,&15,
  0000-0000 0000-0000 0000-0000 0000-0000
&0000-0000 0000-0000 0000-0000 0000-1111
结果为0,停止循环,打印结果,此时结果里已经有个0了
我们判断temp为0停止循环,应该判断其前边为0就停止,修改代码如下:
  1. class arr
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 toHex_1(60);
  6.         }
  7.         public static void toHex_1(int num)
  8.         {
  9.                 //进制转换10--16
  10.                 StringBuffer sb = new StringBuffer();
  11.                 int temp=1;
  12.                 while(temp!=0)
  13.                 {  
  14.                         //System.out.println(num&15);
  15.                         temp = num&15;
  16.                         if(temp==0)//增加此处,判断为0,立马跳出循环,不能让0进入结果
  17.                                 break;
  18.                         if(temp>9)
  19.                                 sb.append((char)(temp-10+'a'));
  20.                         else
  21.                                 sb.append(temp);
  22.                         num = num>>>4;  
  23.                  }
  24.                 System.out.println(sb.reverse());
  25.         }
  26. }
复制代码

作者: 李文帅    时间: 2013-12-4 12:31
楼主程序多运行了一次循环
第一次循环:temp = num&15 = 12;---> sb.append('c'); --->num = num>>>4 = 3
然后判断temp不等于零,进入下次循环
第二次循环:temp = num&15 = 3;---> sb.append(3); --->num = num>>>4  = 0
然后判断temp不等于零,进入下次循环
第三次循环:temp = num&15 = 0;---> sb.append(0); --->num = num>>>4 = 0
然后判断temp等于0,结束循环,所以最终sb = "c30"所以反转后会多一个0
这是我自己洗的代码:
  1. public static void toHex_1(int num){
  2.                 //进制转换10--16
  3.                 StringBuffer sb = new StringBuffer();
  4.                 int temp=num&15;//初始化
  5.                 while(temp!=0){
  6.                         if(temp>9){
  7.                                 sb.append((char)(temp-10+'a'));
  8.                         }else{
  9.                                 sb.append(temp);
  10.                         }
  11.                         num = num>>>4;
  12.                         temp = num&15;
  13.                 }
  14.                 System.out.println(sb);
  15.         }
复制代码

作者: 简★零度    时间: 2013-12-5 22:54
下次问题解决了就把类型改成提问结束!谢谢!




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