我想将一个64位宽的二进制字符串转换成长整型,有一个静态方法:
Long.parseLong(String s, int radix)
我希望做这个,但不适用于我的情况。
问题在于我的二进制字符串是一个机器风格的长整数。
例如:
1111111111111111111111111111111111111111111111111111111110000101
代表着-123
,但是这种方法将其识别为一个巨大的正数,这使我很困扰,我该如何解决这个问题呢?
我必须编写一个补码函数吗?
我想将一个64位宽的二进制字符串转换成长整型,有一个静态方法:
Long.parseLong(String s, int radix)
我希望做这个,但不适用于我的情况。
问题在于我的二进制字符串是一个机器风格的长整数。
例如:
1111111111111111111111111111111111111111111111111111111110000101
代表着-123
,但是这种方法将其识别为一个巨大的正数,这使我很困扰,我该如何解决这个问题呢?
我必须编写一个补码函数吗?
你可以使用 BigInteger
public static void main(String... args) {
String s = "1111111111111111111111111111111111111111111111111111111110000101";
long l = parseLong(s, 2);
System.out.println(s +" => " + l);
String s2 = s.substring(1);
long l2 = parseLong(s2, 2);
System.out.println(s2 +" => " + l2);
}
private static long parseLong(String s, int base) {
return new BigInteger(s, base).longValue();
}
打印1111111111111111111111111111111111111111111111111111111110000101 => -123
111111111111111111111111111111111111111111111111111111110000101 => 9223372036854775685
我用拼凑的方法实现了一个解决方案,仅在您的情况下进行了测试:
public static long makeLong(String input) {
if(input.substring(0,1).equals("1")) {
return -1 * (Long.MAX_VALUE - Long.parseLong(input.substring(1), 2) + 1);
} else {
return Long.parseLong(input, 2);
}
}
基本上,如果第一个位是1,那么这个数字是负数,所以我们将其余部分解析为正数,然后通过从Long.MAX_VALUE
中减去该结果并加一些二进制补码魔术,再将负数强制返回到数字中来。否则,应用正常的转换。
return Long.parseLong(input.substring(1), 2) + Long.MIN_VALUE
。 - x221
。 - Peter Lawreypublic static long makeLong(String input) { return Long.parseUnsignedLong(input, 2); }
这段代码也可以解决问题。 - Maxim Bjjtwinsassert string.length() == 64;
long result = 0;
for (int i = 0; i < 64; ++i) {
char c = string.charAt(63-i);
switch (c) {
case '1': result |= (1L << i); break;
case '0'; break;
default: throw new WhateverException("bad char " + c);
}
}
编辑:我最初使用的是1 << i,这意味着移位是作为int类型进行的。已修复为作为long类型进行移位。
我认为没有一个库函数可以做到你想要的,但是这个方法应该可以:
long num = 0L;
for (int i = 0; i < 64; i++) {
if (yourString.charAt(i) == '1') {
num ^= 1L << (63 - i);
}
}
我认为最简单的方法是使用Long.parseUnsignedLong
,例如:
String str = "1111111111111111111111111111111111111111111111111111111110000101";
System.out.println(Long.parseUnsignedLong(str, 2));
-123
Long.toString(-123,2)
产生-1111011
。 - buruzaemon