在Java中如何将64宽度的二进制字符串转换为长字符串?
我想将64宽度的二进制字符串转换为长字符串,有一个静态方法:在Java中如何将64宽度的二进制字符串转换为长字符串?,java,long-integer,Java,Long Integer,我想将64宽度的二进制字符串转换为长字符串,有一个静态方法: Long.parseLong(String s, int radix) 这样做,但它不适合我的情况 问题是我的二进制字符串是机器风格的长整型 例如: 1111111111111111111111111111111111111111111111111111110000101 表示-123,但此方法将其识别为一个巨大的正数,这让我很困扰,我如何解决此问题 我必须编写一个函数来补充吗?我的骇人听闻的拼凑解决方案,仅在您的案例中测试: pu
Long.parseLong(String s, int radix)
这样做,但它不适合我的情况
问题是我的二进制字符串是机器风格的长整型
例如:
1111111111111111111111111111111111111111111111111111110000101
表示-123
,但此方法将其识别为一个巨大的正数,这让我很困扰,我如何解决此问题
我必须编写一个函数来补充吗?我的骇人听闻的拼凑解决方案,仅在您的案例中测试:
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
中减去该结果并加上1,然后将负数强制返回到返回的数字上,来执行一些2的补码魔术。否则,将应用正常转换。我认为没有库函数来实现您想要的功能,但这应该可以:
long num = 0L;
for (int i = 0; i < 64; i++) {
if (yourString.charAt(i) == '1') {
num ^= 1L << (63 - i);
}
}
long num=0L;
对于(int i=0;i<64;i++){
if(yourString.charAt(i)='1'){
num^=1L您可以自己设置位
assert 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);
}
}
assert string.length()==64;
长结果=0;
对于(int i=0;i<64;++i){
charc=string.charAt(63-i);
开关(c){
案例“1”:结果|=(1L您可以使用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
请你详细解释一下机器风格的long int,以及123是如何用长二进制表示的。因为123的二进制是1111011。如果我没有答对你的问题,很抱歉。首先,非常感谢。它是-123,而不是123,这是负数。机器风格意味着它是计算机硬件的表示,使用“1”在第一位表示负数,0表示非正数,这与人类风格不同,人类使用“-”表示负数。我清楚了吗?我想您可能需要再次检查您的字符串表示形式-123作为一个长数字。long.toString(-123,2)
产生-1111011
。第一个return语句可以替换为return Long.parseLong(input.substring(1,2)+Long.MIN_值
。正如布什总统所说,“太棒了”!很棒的网站,很棒的答案和很棒的家伙。我最喜欢这个答案,但感谢你们所有人的精彩回复。只有当数字长度为64位时,这才有效。如果没有前导零,第一位数字很可能是1
公共静态长makeLong(字符串输入){返回长。parseUnsignedLong(输入,2)}
也能做到这一点