黑马程序员技术交流社区

标题: 关于负数十进制转2进制 [打印本页]

作者: NNERO    时间: 2014-4-23 20:52
标题: 关于负数十进制转2进制
本帖最后由 NNERO 于 2014-4-24 16:56 编辑

首先我知道可以用Integer.toBinary方法直接转,
但是我想自己写一个理解它的概念,我自己的方法如下:
  1. public class Text111 {

  2.         public static void main(String[] args) {
  3.               int sum = -2153;
  4.               System.out.println(toBin(sum));
  5.         }
  6.         public static String toBin(int sum){
  7.                     
  8.                     StringBuilder sb = new StringBuilder();
  9.                     sum=~sum;//按位取反,将其变为正数
  10.                     sum=sum^0x7fffffff;//变正数后,与2进制数0x7fffffff异或 刚好就是负数2进制,但是这是我自己拼出来的,不理解为何
  11.                     do{
  12.                             sb.append(sum%2);//转换后的数,转换为字符串
  13.                     }while((sum/=2)!=0);
  14.                     sb.insert(sb.length()-1, "1");//最高位添加1来获得32位二进制数。
  15.                     return sb.reverse().toString();//调用方法翻转字符串并转为String类型
  16.             }

  17. }
复制代码
注释里有地方不太理解。
这个方法貌似不太好,毕老师说负数2进制是该数正数按位取反再加1,但是按位取反可以,加1怎么搞?加1不就是10进制的1么? 怎么才能加二进制1?
没有头绪,有没有其他算法来转换。

作者: 悠然丶    时间: 2014-4-23 21:04
举例说明-3的二进制算法:帮助楼主理解
0000 0000 0000 0000 0000 0000 0000 0011  =3
1111 1111 1111 1111 1111 1111 1111 1100  取反
0000 0000 0000 0000 0000 0000 0000 0001 +1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1111 1111 1111 1111 1111 1111 1111 1101 = -3
作者: kuroro自走核炮    时间: 2014-4-23 21:08
0x7fffffff
这货就是二进制的11111111-11111111-11111111-11111111
一个正数和这玩意异或就是
00000000-00000000-00000000-01011110(10进制的94,随便找了个数演示。)
11111111-11111111-11111111-11111111
——————————————————异或运算。不同为true即1,相同为false即0,其实就是按位取反了。
11111111-11111111-11111111-10100001就相当于取反了。
然后加1的问题……
16进制的1:0x00000001
8进制的1:00000001
10进制的1:00000001
2进制的1:00000001
11111111-11111111-11111111-10100001
00000000-00000000-00000000-00000001
————————————————————
11111111-11111111-11111111-10100010 负的94
加1……那就是加一嘛……不过你如果要进行字符串修改的话,那就比较麻烦了啊……得先把字符串搞成元素数组,然后判断尾巴上的数组,0就变1,1的话变0还得向前判断进位。
作者: NNERO    时间: 2014-4-23 22:33
kuroro自走核炮 发表于 2014-4-23 21:08
0x7fffffff
这货就是二进制的11111111-11111111-11111111-11111111
一个正数和这玩意异或就是

果断是比较麻烦了。呵呵,理解了,谢谢
作者: taulinxinny    时间: 2014-4-24 00:43
同样受教了!




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