【问题标题】:how to convert negative number to binary in java?如何在java中将负数转换为二进制?
【发布时间】:2019-07-09 22:01:21
【问题描述】:

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

然后我被困在第二步的二进制结果中“加一”,即:

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

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

【问题讨论】:

  • 我不太明白你想要达到什么目的。但是如果你有一个long,那么它已经被转换成二进制了。如果你想以字符串的形式访问这个 long 的二进制表示,那么你可以使用 Long 类的 toBinaryString 方法,例如:Long.toBinaryString(-1477552144L)
  • 天哪。我什至不知道它有这个方法。这就是我真正想要的..

标签: java binary


【解决方案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));

【讨论】:

    【解决方案2】:

    假设长值是-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);
    

    但是所有的Strings、ints、longs等本质上都是以二进制形式存储的,并根据上下文以不同的格式显示。

    【讨论】:

      猜你喜欢
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 2012-12-10
      • 1970-01-01
      • 2017-07-13
      • 2018-10-10
      • 1970-01-01
      相关资源
      最近更新 更多