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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 彭刚 初级黑马   /  2013-12-4 11:39  /  1057 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么结果多个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());
}
}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

3 个回复

倒序浏览
在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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
楼主程序多运行了一次循环
第一次循环: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.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
下次问题解决了就把类型改成提问结束!谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马