Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中如何将64宽度的二进制字符串转换为长字符串?_Java_Long Integer - Fatal编程技术网

在Java中如何将64宽度的二进制字符串转换为长字符串?

在Java中如何将64宽度的二进制字符串转换为长字符串?,java,long-integer,Java,Long Integer,我想将64宽度的二进制字符串转换为长字符串,有一个静态方法: Long.parseLong(String s, int radix) 这样做,但它不适合我的情况 问题是我的二进制字符串是机器风格的长整型 例如: 1111111111111111111111111111111111111111111111111111110000101 表示-123,但此方法将其识别为一个巨大的正数,这让我很困扰,我如何解决此问题 我必须编写一个函数来补充吗?我的骇人听闻的拼凑解决方案,仅在您的案例中测试: pu

我想将64宽度的二进制字符串转换为长字符串,有一个静态方法:

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)}
也能做到这一点