如何在Java中将负数转换为二进制?

时间:2019-07-09 12:45:21

标签: java binary

我正在尝试将负长数(例如-1065576264718330231L)转换为二进制。 首先,我通过删除符号将负数转换为正数; 其次,我从第一步获得结果的二进制文件;

然后,在第二步的二进制结果中,我陷入了“加一”的问题:

enter image description here

请!如何执行第三步? 还是您还有其他更好的解决方案?!

http://geekexplains.blogspot.com/2009/05/binary-rep-of-negative-numbers-in-java.html

2 个答案:

答案 0 :(得分:1)

带符号整数/长整数使用两个补码表示法:

假设您有-6:

6 = 000..000 110 binary
    111..111 001 one's complement
    111..111 010 add 1
-6 = 111..111 010

优点是正常的二进制加法有效(-6 + 6 = 0),只有一个0。

您可以简单地从0中减去6:

      000
      110
   ------ -
        0
       1   borrow 1 (all ones at the top)
      0
...111

111...111010 = -6

Note:
If one borrows (subtracts one of) 0000000, one actually uses an overflow:
                               (1)0000000 which minus 1 delivers
                                  1111111

好东西:

long n = -1065576264718330231L;
System.out.println(Long.toUnsignedString(n, 2));
System.out.println(Long.toString(n, 2));

答案 1 :(得分:1)

给定长值为-1065576264718330231L

      long v = -1065576264718330231L;

      System.out.println(Long.toBinaryString(v));

或者您可以自己编写算法

      StringBuilder sb = new StringBuilder();
      while (v != 0) {
         sb.append(v < 0 ? '1'
               : '0');
         v <<= 1;
      }
      System.out.println(sb.toString());

如果要使用2's complement将正数转换为负数,可以执行以下操作:

      long pos = 23;
      long neg = ~pos + 1;
      System.out.println(pos);
      System.out.println(neg);

但是所有的String,int,long等都固有地以二进制存储,并根据上下文以不同的格式显示。