我正在尝试将负长数(例如-1065576264718330231L)转换为二进制。 首先,我通过删除符号将负数转换为正数; 其次,我从第一步获得结果的二进制文件;
然后,在第二步的二进制结果中,我陷入了“加一”的问题:
请!如何执行第三步? 还是您还有其他更好的解决方案?!
http://geekexplains.blogspot.com/2009/05/binary-rep-of-negative-numbers-in-java.html
答案 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等都固有地以二进制存储,并根据上下文以不同的格式显示。