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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fighting 中级黑马   /  2013-3-30 09:31  /  1690 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 fighting 于 2013-4-2 21:00 编辑

昨天看一哥们在论坛里发了个进制转换的问题,里面实现了从十进制转换成其它进制的操作
其中的一段代码与JDK中的代码十分相似,但我研究了半天也没明白什么意思
帖出来给大家看看:
  1. public static String toBinaryString(int i) {
  2.         return toUnsignedString(i, 1);
  3.     }

  4.     /**
  5.      * Convert the integer to an unsigned number.
  6.      */
  7.     private static String toUnsignedString(int i, int shift) {
  8.         char[] buf = new char[32];
  9.         int charPos = 32;
  10.         int radix = 1 << shift;
  11.         int mask = radix - 1;
  12.         do {
  13.             buf[--charPos] = digits[i & mask];
  14.             i >>>= shift;
  15.         } while (i != 0);

  16.         return new String(buf, charPos, (32 - charPos));
  17.     }
复制代码
这是Integer类中由十进制转化成二进制的方法,其中的do...while循环是什么原理,是类似于除2取余么?但不知道为什么这样做。。。

点评

如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢  发表于 2013-4-2 20:02

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

倒序浏览
  1. /**
  2. 这里的函数和代码还有变量我改成我习惯的了  但是没改代码  只是替换了一下变量名称。
  3. */
  4. class java0330d1
  5. {
  6.         public static String shuzu1(int z)
  7.         {
  8.         return shuzu(z, 1);
  9.     }

  10.     /**
  11.      * Convert the integer to an unsigned number.
  12.      */
  13.     private static String shuzu(int z, int x) {
  14.         char[] a = new char[32];//定义一个里面有32个角标位的char类型数组。
  15.         int charPos = 32;//这个貌似是定义箭头,初始值是32.难道是简写?怎么和我知道的不太一样。
  16.         int b = 1 << x;//这句没看懂,为什么定义的b要向左位移一位在赋值给mask,直接int mask=(1<<x)-1;不行吗
  17.         int mask = b - 1;
  18.         do {
  19.             a[--charPos] = digits[z & mask];//这一句中的digits应该是另一个数组,为什么我没找到定义这个数字的代码? 而且我的系统报错就是报错找不到这个变量。
  20.             z >>>= x;//这个是右移一位
  21.         } while (z != 0);//判断z是否等于0,不等于就继续运算。

  22.         return new String(a, charPos, (32 - charPos));
  23.     }
  24. }
复制代码
digits这与个数组是什么没弄明白 我就这里报错了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
而且为什么他定义的箭头不-1?

它定义的数组有32个角标位,但是最大的角标应该是31啊?

不懂不懂
回复 使用道具 举报
十进制转二进制最好记的计算方式是:除以2求余数,将余数倒序
回复 使用道具 举报
public static String toBinaryString(int i) {
        return toUnsignedString(i, 1);
    }

    /**
     * Convert the integer to an unsigned number.//返回一个无符号整形数字
     */
    private static String toUnsignedString(int i, int shift)//返回一个无符号字符串(实现十进制转二进制) {
        char[] buf = new char[32];//创建一个数组
        int charPos = 32;//buf数组长度
        int radix = 1 << shift;//将1左移shift(1)个位置并赋值给radix
        int mask = radix - 1;//mask=2-1;
        do {
            buf[--charPos] = digits[i & mask];//二进制与运算,不知道这个digits是什么意思,难道是实现0和1的值?
            i >>>= shift;//将i右移shift(1)个位置
        } while (i != 0);//判断i是否为零,为零则结束循环

        return new String(buf, charPos, (32 - charPos));//String(char[] value, int offset, int count) 分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
        //例子:char[] a={'0','0','1','1','0'};System.out.println(new String(a,0,3));结果:001
    }

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

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