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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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, 下载次数: 77)

QQ截图20140307170419.png

评分

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

查看全部评分

7 个回复

倒序浏览
用无符号右移
num = num>>4;//  应该改成num = num>>>4;

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 Zero霖 于 2014-3-7 18:59 编辑

num=num>>>4,“>>>”表示无符号右移,而“>>”表示右移,单纯的右移时二进制码最高位会一直补1,这样循环就停不下来,pos减到负值数组下标是没有负值的,自然就报错了。

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 榨菜 于 2014-3-7 19:00 编辑

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



-60 ---> FFFFFFFFFFFFFFC4

评分

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

查看全部评分

回复 使用道具 举报
把 num = num>>4 改成 num = num>>>4;因为负数的最高位是1,所以>>移位的时候会不断的补1,不断循环,所以报错.

评分

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

查看全部评分

回复 使用道具 举报
>>换成>>>  >>高位是什么补什么,负数>>最后全补的11111111,>>>高位无论是什么不得全是00000000
要&运算的,有符号右移就不行了

评分

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

查看全部评分

回复 使用道具 举报
在26行 数据移位时,应为num>>>4 用无符号右移
而非>>带符号右移

评分

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

查看全部评分

回复 使用道具 举报
给你三种转换的方法(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. }
复制代码


评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马