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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘策 中级黑马   /  2013-4-3 07:44  /  1955 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘策 于 2013-4-3 14:11 编辑
  1. public class TransBinary {
  2.         public static void main(String[] args){
  3.                 String arr = transBinary(-10,1,1);
  4.                 System.out.println(arr);
  5.                
  6.         }
  7.         public static String transBinary(int num,int offset,int count){
  8.                 if(num == 0){
  9.                         System.out.println(0);
  10.                         return null;
  11.                 }
  12.                 char[] arr = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F',};
  13.                 char[] arrs = new char[32];
  14.                 int pos = arr.length;
  15.                 while(num != 0){
  16.                          int temp = num & count;
  17.                         arrs[--pos] = arr[temp];
  18.                         num = num >>> offset;
  19.                 }
  20.                 return new String(arrs,pos,arr.length-1);
  21.         }
  22. }
复制代码
为什么这个程序输入正数没有问题,可是一输入负数就挂呢,

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 邵震 于 2013-4-3 08:20 编辑

现在坑在答题
  1. class java0403d3
  2. {
  3.         public static void hanshu(int x,int y,int z)
  4.         {
  5.                 if(x==0)
  6.                 {
  7.                         System.out.println("您输入的数是:"+0);       
  8.                         return;
  9.                 }
  10.                 if(y==0)
  11.                 {
  12.                         return;
  13.                 }
  14.                 System.out.print("您输入的数转换后为:");
  15.                 char [] shuzu = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
  16.                 char [] arr=new char [32];
  17.                 int pos = arr.length;
  18.                 while (x!=0)
  19.                 {
  20.                         int temp =x&y;
  21.                         arr[--pos]=shuzu[temp];
  22.                         x=x>>>z;
  23.                 }
  24.                         System.out.print(arr);
  25.         }
  26.         public static void to(int x,int y)
  27.         {
  28.                 int a=0,b=0;
  29.                 switch (y)
  30.                 {
  31.                 case 2:
  32.                         a=1;b=1;
  33.                         break;
  34.                 case 8:
  35.                         a=7;b=3;
  36.                         break;
  37.                 case 16:
  38.                         a=16;b=4;
  39.                         break;
  40.                 default:
  41.                         System.out.println("对不起老师没教我转换成你需要的这个进制的方式");
  42.                         break;
  43.                 }
  44.                 hanshu(x,a,b);
  45.         }
  46.         public static void main(String[] args)
  47.         {
  48.                 to(-10,2);//逗号前输入想转化的十进制数,逗号后输入想转换的进制数。
  49.                 //逗号后面只能输入2.8.16. 输入任何非2.8.16的数字都将默认为16进制。
  50.         }       
  51. }
复制代码
说实话我也没找出你的错误在那里 这个是我自己打的 你看看吧 我这个能转换负数

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 虽然没找到错误。。。。

查看全部评分

回复 使用道具 举报
num = num >>> offset 这一步 假如你的num是负数,得到的num值会是一个很大的正数  然后你的while循环次数将会超过你的数组长度所以他会报错   在public static String transBinary(int num,int offset,int count)传参的时候你传一个很大的正数也是会报错的

点评

负数无符号右移额  发表于 2013-4-3 09:57
回复 使用道具 举报
额,这是你没有明白二进制的原理,
我就说重点吧。
负数怎么转换成二进制。
1.求绝对值的二进制
2.求其反码
3.加1
例如:-1 1的原码 0000 0001
取反:1111 1110
+1: 1111 1111

还有小数问题,代码中你还没有解决小数求二进制问题。

十进制小数转换成二进制小数的方法时:连续用基数2去乘以小数,直到乘积的小数部分等于0然后顺序取整数部分。
例如:
(0.8125)10
0.8125 x 2 = 1.625 取整数位 1
0.625 x 2  = 1.25 去整数位   1
0.25 x 2 = 0.5     取整数位 0
0.5 x 2 = 1.0 取整数位 1
(0.8125)10 = (0.1101)2 . 代码就自己实现了,能更加理解这个概念



回复 使用道具 举报
  1. public class TransBinary {
  2.     public static void main(String[] args){
  3.             String arr = transBinary(-6,1,1);
  4.             System.out.println(arr);
  5.             
  6.     }
  7.     public static String transBinary(int num,int offset,int count){
  8.             if(num == 0){
  9.                     System.out.println(0);
  10.                     return null;
  11.             }
  12.             char[] arr = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F',};
  13.             char[] arrs = new char[32];
  14.             int pos = arrs.length;
  15.             int times = 0;
  16.             while(num != 0){
  17.                     int temp = num & count;
  18.                     arrs[--pos] = arr[temp];
  19.                     num = num >>> offset;
  20.                     times++;
  21.             }
  22.             return new String(arrs,pos,times);
  23.     }
  24. }
复制代码
pos应该等于arrs的长度
new String(char[] ch,int offsite,int length)最后一个参数是长度
回复 使用道具 举报
谢波 发表于 2013-4-3 10:45
pos应该等于arrs的长度
new String(char[] ch,int offsite,int length)最后一个参数是长度 ...

呵呵,以后要注意了,
回复 使用道具 举报
数组角标可以为负数?{:soso_e132:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马