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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 范龙波 高级黑马   /  2013-1-22 04:28  /  1024 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-23 09:54 编辑

//写一个 十进制转换成多禁止的 函数
class shuzhizhuanhuan
{ public static void main(String[] args)
{
  zhuanhuan(886,15,4);
  System.out.println();
}
public static void zhuanhuan(int key,int x,int y)
{
  char[] chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  char[] arr=new char[32];
  int pot=arr.length-1;
  while(key!=0)
  {
   int tem=key & x;
   arr[pot--]=chs[tem];
   key=(tem>>>y);
  }
  for(int z=pot;z<arr.length;z++)      //这个代码我打印不出正确结果,看了将近半宿了,可是不知道问题出在哪里,希望得到指点。
  {System.out.print(arr[z]);}
  
  
  
  
}
}               

评分

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

查看全部评分

5 个回复

倒序浏览
你的代码某个地方写错了,导致只算出1-4位的值,后面的值都没算。
//写一个 十进制转换成多禁止的 函数
class shuzhizhuanhuan
{ public static void main(String[] args)
{
  zhuanhuan(886,15,4);
  System.out.println();
}
public static void zhuanhuan(int key,int x,int y)
{
  char[] chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  char[] arr=new char[32];
  int pot=arr.length-1;
  while(key!=0)
  {
   int tem=key & x;
   arr[pot--]=chs[tem];
   key=(tem>>>y);
  }
  for(int z=pot;z<arr.length;z++)      //这个代码我打印不出正确结果,看了将近半宿了,可是不知道问题出在哪里,希望得到指点。
  {System.out.print(arr[z]);}

}
}
  
红色字的tem改成key,你就可以没问题。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

分析下这几段  
int tem=key & x;
   arr[pot--]=chs[tem];
   key=(tem>>>y);

key是886  
x=15
15的二进制是1111
886的二进制表示是1101110110  
按4位分隔开来开0011 -0111- 0110

第一段是  int tem=key & x;
886和15做与运算  :  0011-0111-0110
                                 0000-0000-1111
                                -----------------------
                                 0000-0000-0110
做完运算得6,而你程序的结果是6,很显然你后面的与运算都没成功,接着把6赋给tem

第二段把tem[6]值赋给数组


第三段  key=(tem>>>y);
这时你的tem的值是0000-0000-0110
按照tem>>>y  右移4位 tem 就变成0000-0000-0000 然后把0赋给key,key=0循环结束,所以你最终结果只有6.

把tem改成为key就可以了


  
  
  

点评

非常感谢,看完你举得例子立刻就知道哪错了。  发表于 2013-1-22 10:54

评分

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

查看全部评分

回复 使用道具 举报
   int tem=key & x;
   arr[pot--]=chs[tem];
   key=(key>>>y);     //这里相当于给key除以16.是把传入的key左移4位,不是 tem   

点评

谢谢,问题解决了。  发表于 2013-1-22 10:53
回复 使用道具 举报
jy00228875 发表于 2013-1-22 06:52
你的代码某个地方写错了,导致只算出1-4位的值,后面的值都没算。
//写一个 十进制转换成多禁止的 函数
cla ...

  非常感谢,昨天看了半宿都没看出哪有问题,讲的很明白理解了。
回复 使用道具 举报
本帖最后由 黑马刘杰 于 2013-1-22 14:19 编辑

有个不错的进制转换的方法,不过不能大于十进制,你看看吧
  1. /*
  2.          * num:要转换的十进制数值
  3.          * x:进制
  4.          */
  5.         public static void foo(int num,int x){
  6.                 if (num > 0) {
  7.                             foo(num / x,x);
  8.                             System.out.print(num % x);
  9.                     }
  10.         }
复制代码
回复 使用道具 举报
  1. /*
  2.          * num:要转换的十进制数值
  3.          * x:进制
  4.          */
  5.         public static void foo(int num,int x){
  6.                 int tmp=0;
  7.                 if (num > 0) {
  8.                             foo(num / x,x);
  9.                             if((tmp=num % x)>=10){
  10.                                     System.out.println((char)(tmp-10+'a'));
  11.                             }else{
  12.                                     System.out.print(tmp);
  13.                             }
  14.                            
  15.                     }
  16.         }
复制代码

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

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