黑马程序员技术交流社区

标题: 关于查表法-十进制转16进制 -代码的一点小问题 [打印本页]

作者: 会说话的木头    时间: 2014-3-7 17:05
标题: 关于查表法-十进制转16进制 -代码的一点小问题
  1. class chabiaofa
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.         toHex(-60);
  6.         }
  7.        
  8.        
  9.        
  10.         public static void toHex(int num)
  11.         {
  12.                 char[] chs = {'o','1','2','3',
  13.                                                   '4','5','6','7',
  14.                                           '8','9','A','B',
  15.                                                  'C','D','E','F'};
  16.                 char [] arr = new char [8];
  17.                 int pos = arr.length;
  18.                 while (num!=0)
  19.                
  20.                 {

  21.                         int temp = num &15;
  22.                         //System.out.println(chs[temp]);
  23.                         arr[--pos]= chs[temp];

  24.                         num = num>>4;
  25.                 }

  26.                 for (int x=pos;x<arr.length ;x++ )
  27.                 {
  28.                         System.out.print(arr[x]+",");
  29.                 }
  30.         }


  31. }
复制代码
输入60 没问题,但是输入-60,编译通过,但是结果报错!如图所见!

QQ截图20140307170419.png (2.22 KB, 下载次数: 81)

QQ截图20140307170419.png

作者: nicholyx    时间: 2014-3-7 18:48
用无符号右移
num = num>>4;//  应该改成num = num>>>4;
作者: Zero霖    时间: 2014-3-7 18:53
本帖最后由 Zero霖 于 2014-3-7 18:59 编辑

num=num>>>4,“>>>”表示无符号右移,而“>>”表示右移,单纯的右移时二进制码最高位会一直补1,这样循环就停不下来,pos减到负值数组下标是没有负值的,自然就报错了。
作者: 榨菜    时间: 2014-3-7 18:57
本帖最后由 榨菜 于 2014-3-7 19:00 编辑

>>右移    如果最高位0,右移后,用0补空位。
               如果最高位1,右移后,用1补空位。
>>>       无论最高位是什么,右移后,都用0补。



-60 ---> FFFFFFFFFFFFFFC4

作者: MVP    时间: 2014-3-8 10:43
把 num = num>>4 改成 num = num>>>4;因为负数的最高位是1,所以>>移位的时候会不断的补1,不断循环,所以报错.
作者: 一诺千金    时间: 2014-3-8 11:41
>>换成>>>  >>高位是什么补什么,负数>>最后全补的11111111,>>>高位无论是什么不得全是00000000
要&运算的,有符号右移就不行了
作者: 小脚印    时间: 2014-3-8 11:47
在26行 数据移位时,应为num>>>4 用无符号右移
而非>>带符号右移
作者: syw02014    时间: 2014-3-8 11:54
给你三种转换的方法(num=num>>>4,“>>>”表示无符号右移,而“>>”表示右移),希望能帮到你:
  1. class ArrayTestToHex
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println("输入一个要转成16进制的数:");
  6.                 Scanner in = new Scanner(System.in);   
  7.                 int num=in.nextInt();

  8.                 System.out.println("第一种方法:");
  9.                 toHex(num);
  10.                 System.out.println("第二种方法:");
  11.                 toHex_1(num);
  12.                 System.out.println("第三种方法:");
  13.                 toHex_2(num);
  14.         }

  15.         public static void toHex(int num)
  16.         {
  17.                 if(num==0)
  18.                 {
  19.                         System.out.println("0");
  20.                         return ;
  21.                 }
  22.                 char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  23.                 char[] arr = new char[8];
  24.                 int pos = arr.length;
  25.                 while(num!=0)
  26.                 {
  27.                         int temp = num&15;
  28.                         arr[--pos] = chs[temp];
  29.                         num = num >>> 4;
  30.                 }
  31.                
  32.                 System.out.println("pos="+pos);
  33.                 for(int x=pos ;x<arr.length; x++)
  34.                         System.out.print(arr[x]);
  35.         }
  36.        
  37.         public static void toHex_1(int num)
  38.         {
  39.                 char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  40.                 for(int x=0 ; x<8; x++)
  41.                 {
  42.                         int temp = num & 15;
  43.                         System.out.print(chs[temp]);
  44.                         num = num >>> 4;
  45.                 }
  46.         }
  47.        
  48.         public static void toHex_2(int num)
  49.         {
  50.                 for(int x=0; x<8; x++)
  51.                 {
  52.                         int temp = num & 15;
  53.                         if(temp>9)
  54.                                 System.out.print((char)(temp-10+'A'));
  55.                         else
  56.                                 System.out.print(temp);
  57.                         num = num >>> 4;
  58.                 }
  59.         }
  60. }
复制代码







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