黑马程序员技术交流社区

标题: 一个小疑惑 [打印本页]

作者: 李罡    时间: 2013-3-6 15:05
标题: 一个小疑惑
本帖最后由 李罡 于 2013-3-10 00:05 编辑

一样的表示方法,为什么十六进制那个可以正确转换,而二进制那个不可以呢?

QQ截图20130306150344.png (15.42 KB, 下载次数: 14)

QQ截图20130306150344.png

QQ截图20130306150406.png (15.3 KB, 下载次数: 18)

QQ截图20130306150406.png

作者: 张豪杰    时间: 2013-3-6 16:15
你的二进制转换只能转换正正数,出现负数就有问题了呗
我给你改下~~
具体思想是,负数取绝对值取反后加1,就是它的二进制啦~
public class test{
         public static void main(String[] args) {
                  StringBuffer sbf = toBin(6);
                  String str = sbf.reverse().toString();
                  System.out.println(str);
                  sbf = toBin(-6);
                  str = sbf.reverse().toString();
                  System.out.println(str);
                 }
         
        static StringBuffer toBin(int num) {//目前只考虑int型整数,带小数的暂不考虑
                  StringBuffer result = new StringBuffer();
                  int n = 0;
                  if(num>=0){ //先判断要转换的数是不是正整数
                   n = num;
                   do {
                    result.append(n % 2);
                    n /= 2;
                   } while (n > 0);
                   }
                  
                  else{  //负数就先取绝对值然后取反后再加1,然后再转换成2进制
                   n=(num*-1^255)+1; //这里的运算顺序是num*负1然后再^255,不了解的话可以去百度下运算符优先级
                   do {
                    result.append(n % 2);
                    n /= 2;
                   } while (n > 0);
                    
                  }
                  return result;
                 }
}
作者: 李罡    时间: 2013-3-6 21:03
张豪杰 发表于 2013-3-6 16:15
你的二进制转换只能转换正正数,出现负数就有问题了呗
我给你改下~~
具体思想是,负数取绝对值取反后加1, ...

额,表示没看懂。。。
作者: 张豪杰    时间: 2013-3-6 21:27
李罡 发表于 2013-3-6 21:03
额,表示没看懂。。。

你知道负数的二进制是怎么转换的么?
就是负数的绝对值,取反后再加1
比如-6,先求出他的绝对值,也就是6,再代码里我是用num*-1取得结果,这样比较简便
取得绝对值后就进行取反了,这一步我是用异或255进行的
6的二进制是110(前面有29个0省略不写了),255的二进制是11111....(总共32个1)
异或的运算方式是:两边相同为假,不同为真,也就是说1^1和0^0结果都是0,不相同的话结果就是1;
这样看的话,任何32位以内的整数异或上255,不就是相当于取反了么?(如果你不知道什么叫取反,我再跟你解释;取反:就是原来是0,那就换成1,原来是1,那就是变成0)
好了,前面取绝对值取反都做了,剩下一个步骤就是加1了。
前面说的一大堆,我都浓缩成这么一个语句了n=(num*-1^255)+1;
此时的n就是所要求的数,它是所求的数的十进制的体现,所以我们要把它变成2进制表现出来
result.append(n % 2);   n /= 2;在循环体中用这两句语句进行转换,这里不用我解释了吧
作者: 陈丽莉    时间: 2013-3-7 14:54
如果清楚了,请将分类改成【已解决】~
作者: 李罡    时间: 2013-3-9 23:44
张豪杰 发表于 2013-3-6 21:27
你知道负数的二进制是怎么转换的么?
就是负数的绝对值,取反后再加1
比如-6,先求出他的绝对值,也就是6 ...

谢谢,我还以为255是255次方呢。。。尴尬。。。嗯,异或取反加1就行了。只是有一点我还觉得奇怪,为什么负数转十六进制没问题呢
作者: 张豪杰    时间: 2013-3-9 23:51
李罡 发表于 2013-3-9 23:44
谢谢,我还以为255是255次方呢。。。尴尬。。。嗯,异或取反加1就行了。只是有一点我还觉得奇怪,为什么 ...

你仔细对比一下实现二进制的代码和实现十六进制的代码
两种实现方法是完全不同的
二进制是依赖于对2进行取模来换算二进制
但是十六进制是通过位移运算来进行换算
也就是>>,这个位移运算符号是保留最高位的,也就是说,每一次右移,就相当于把前面的0变成1了(负数最高位是1),这也就不存在正负整数转换的局限性了
作者: 张卫刚    时间: 2013-3-9 23:54
学习哈,努力

作者: 李罡    时间: 2013-3-10 00:04
张豪杰 发表于 2013-3-9 23:51
你仔细对比一下实现二进制的代码和实现十六进制的代码
两种实现方法是完全不同的
二进制是依赖于对2进行 ...

弄清楚了,转二进制那个应该改成num&1,num>>>1,这样就可以了!谢谢
作者: 张豪杰    时间: 2013-3-10 00:08
李罡 发表于 2013-3-10 00:04
弄清楚了,转二进制那个应该改成num&1,num>>>1,这样就可以了!谢谢

恩,这个方法比我的高效很多~~~厉害啊
作者: 李罡    时间: 2013-3-10 00:32
张豪杰 发表于 2013-3-10 00:08
恩,这个方法比我的高效很多~~~厉害啊

呵呵,是你告诉我的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2