1

我正在尝试对 Java 中的两个 64 位 Long 变量进行 XOR 操作。问题是当我在变量中添加超过 16 位时它会失败。

例如,这有效并返回 7:

Long h1 = Long.parseLong("1100001101001101");
Long h2 = Long.parseLong("1100001101000001");
System.out.println(Long.bitCount(h1 ^ h2));

如果我将 h1 和 h2 的值增加到:

Long h1 = Long.parseLong("11000110000110100110101101001101");
Long h2 = Long.parseLong("11000011100001101001101101000001");

我收到一个错误:

线程“主”java.lang.NumberFormatException 中的异常:对于输入字符串:“11000110000110100110101101001101”

java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
在 java.lang.Long.parseLong(Long.java:592)
在java.lang.Long.parseLong(Long.java:631)

如果我将它加倍(我想要计算的 64 位)也是一样的:

Long h1 = Long.parseLong("1100011100011000011010011010110100110110000110100110101101001101");
Long h2 = Long.parseLong("1100001110001100001101001101011010011011100001101001101101000001");

关于为什么在 16 位以上失败的任何帮助?

4

2 回答 2

6

Long.parseLong("11000110000110100110101101001101")尝试将其解析String为十进制数,并且此数字太大而无法放入long变量中。

要将 解析String为二进制数,您需要指定基数:

Long.parseLong("11000110000110100110101101001101",2);

顺便说一句,Long.parseLong返回 a long,所以我要么将其分配给 a long

long h1 = Long.parseLong("11000110000110100110101101001101",2);

或使用Long.valueOf

Long h1 = Long.valueOf("11000110000110100110101101001101",2);
于 2019-10-11T07:26:49.963 回答
0

将此二进制字符串转换为数字,然后执行 XOR。像 convert 0110 -> 6, 1000 -> 8 等等......那么它不会给出任何异常。

public class Bin2Num {
    public static void main(String[] args) {
        long num1 = Bin2Num.funcBin2Long(args[0]);
        long num2 = funcBin2Long(args[1]);

        System.out.println("Num1 : " + num1);
        System.out.println("Num2 : " + num2);
        System.out.println("Num1 XOR num2 : " + (long)(num1 ^ num2));
    }

    public static long funcBin2Long(String str) {
        long answer = 0;
        for(int i = str.length() - 1, j = 0; i >= 0; i--, j++) {
            if(str.charAt(i) == '1') answer += Math.pow(2, j);
        }
        return answer;
    }
}
于 2019-10-11T07:55:57.943 回答