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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵阳 中级黑马   /  2012-6-23 10:15  /  1711 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邵阳 于 2012-6-23 18:12 编辑
  1. class Shao
  2. {
  3. public static void main(String[] args)
  4. {
  5. shao_2(-60);
  6. }


  7. public static void shao_1(int key,int a,int b)
  8. {
  9. char []chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E'};
  10. char[]chr=new char[32];
  11. int pose=0;

  12. while( key!=0)
  13. {
  14. int temp=key&a;
  15. chr[pose++]=chs[temp];
  16. key=key>>>b;

  17. }
  18. for (int x=pose-1;x>=0 ;x-- )
  19. {
  20. System.out.print(chr[x]+",");
  21. }

  22. }

  23. public static void shao_2(int key)
  24. {
  25. shao_1(key,15,4);
  26. }
  27. public static void shao_3(int key)
  28. {
  29. shao_1(key,1,1);
  30. }
  31. public static void shao_4(int key)
  32. {
  33. shao_1(key,7,3);
  34. }
  35. }
复制代码
我输入数字是-60 ,然后可以正确转化成二进制,八进制。但是十六进制却出现
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 15
        at Shao.shao_1(Demo.java:68)
        at Shao.shao_2(Demo.java:81)
        at Shao.main(Demo.java:7)
我知道这个意思是数组的上限超出了,但是还是不知道错误在哪,还有如何改正。






另外就是能不能详细讲一下为什么

chr[pose++]=chs[temp];    这里多增一次啊
所以 int  x=pose-1。
把运算过程写一下吧。比老师没有讲明白

8 个回复

倒序浏览
十六进制的F去哪了?
回复 使用道具 举报
chr[pose++]=chs[temp];    是pose++运算完再加1(当pose是最后一个的时候,pose运算时是你要的数据,但后面还有一个++,所以要加1然后再回去判断,这时条件不满足了,但结果已经是加1后的了。
回复 使用道具 举报
黑马-李勇 发表于 2012-6-23 10:22
十六进制的F去哪了?

知道啦,一时疏忽,见笑
回复 使用道具 举报
黑马-李勇 发表于 2012-6-23 10:28
chr=chs[temp];    是pose++运算完再加1(当pose是最后一个的时候,pose运算时是你要的数据,但后面还有一 ...

还是不明白,能不能运算过程一个一个写下来,还有这个a++和++a,在这的详细用法
回复 使用道具 举报
char []chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E'}; //少了一个F
chr[pose++]=chs[temp];//每赋值一次后 pose就加一次,所以说pose的值 比实际位数多了一位数   打印的时候自然要再pose-1 一次
回复 使用道具 举报
char []chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E'};//少一个F
chr[pose++]=chs[temp];// pose没赋值一次后 pose就自动加一次  所以在赋值完后pose的位数比实际位多一位  打印的时候自然要再pose-1一下

回复 使用道具 举报
class Shao
{
public static void main(String[] args)
{
shao_2(-60);
}

public static void shao_1(int key,int a,int b)
{
char []chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[]chr=new char[32];
int pose=-1;//初始下,因为用的是++pose为了操作脚标0,这时只能是-1了
while( key!=0)
{
int temp=key&a;
chr[++pose]=chs[temp];
key=key>>>b;
}
for (int x=pose-1;x>=0 ;x-- )
{
System.out.print(chr[x]+",");
}
}
public static void shao_2(int key)
{
shao_1(key,15,4);
}
}


guocheng.JPG (26.6 KB, 下载次数: 22)

guocheng.JPG

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
孙飞 中级黑马 2012-6-23 11:26:12
9#
因为你创建的用来查表的数组少了F,所以范围就会不一样了,所以出错。你这里chr[pose++]=chs[temp];是在做完赋值运算后会自增一次,所以下面要先减一才得到的是最大角标值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马