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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李罡 中级黑马   /  2013-3-6 15:05  /  1555 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李罡 于 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

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

10 个回复

倒序浏览
你的二进制转换只能转换正正数,出现负数就有问题了呗
我给你改下~~
具体思想是,负数取绝对值取反后加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;
                 }
}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
张豪杰 发表于 2013-3-6 16:15
你的二进制转换只能转换正正数,出现负数就有问题了呗
我给你改下~~
具体思想是,负数取绝对值取反后加1, ...

额,表示没看懂。。。
回复 使用道具 举报
李罡 发表于 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-10 00:04
回复 使用道具 举报
张豪杰 发表于 2013-3-6 21:27
你知道负数的二进制是怎么转换的么?
就是负数的绝对值,取反后再加1
比如-6,先求出他的绝对值,也就是6 ...

谢谢,我还以为255是255次方呢。。。尴尬。。。嗯,异或取反加1就行了。只是有一点我还觉得奇怪,为什么负数转十六进制没问题呢
回复 使用道具 举报
李罡 发表于 2013-3-9 23:44
谢谢,我还以为255是255次方呢。。。尴尬。。。嗯,异或取反加1就行了。只是有一点我还觉得奇怪,为什么 ...

你仔细对比一下实现二进制的代码和实现十六进制的代码
两种实现方法是完全不同的
二进制是依赖于对2进行取模来换算二进制
但是十六进制是通过位移运算来进行换算
也就是>>,这个位移运算符号是保留最高位的,也就是说,每一次右移,就相当于把前面的0变成1了(负数最高位是1),这也就不存在正负整数转换的局限性了
回复 使用道具 举报
学习哈,努力
回复 使用道具 举报
李罡 中级黑马 2013-3-10 00:04:21
9#
张豪杰 发表于 2013-3-9 23:51
你仔细对比一下实现二进制的代码和实现十六进制的代码
两种实现方法是完全不同的
二进制是依赖于对2进行 ...

弄清楚了,转二进制那个应该改成num&1,num>>>1,这样就可以了!谢谢
回复 使用道具 举报
李罡 发表于 2013-3-10 00:04
弄清楚了,转二进制那个应该改成num&1,num>>>1,这样就可以了!谢谢

恩,这个方法比我的高效很多~~~厉害啊
回复 使用道具 举报
张豪杰 发表于 2013-3-10 00:08
恩,这个方法比我的高效很多~~~厉害啊

呵呵,是你告诉我的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马