Java对Long变量的XOR操作和BitCount返回java.lang.NumberFormatException

c13*_*554 1 java xor bitcount hamming-distance long-integer

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

例如,这有效并返回7:

Long h1 = Long.parseLong("1100001101001101");
Long h2 = Long.parseLong("1100001101000001");
System.out.println(Long.bitCount(h1 ^ h2));
Run Code Online (Sandbox Code Playgroud)

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

Long h1 = Long.parseLong("11000110000110100110101101001101");
Long h2 = Long.parseLong("11000011100001101001101101000001");
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

例外在线程“主” 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");
Run Code Online (Sandbox Code Playgroud)

关于为什么为什么失败超过16位有帮助吗?

Era*_*ran 6

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

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

Long.parseLong("11000110000110100110101101001101",2);
Run Code Online (Sandbox Code Playgroud)

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

long h1 = Long.parseLong("11000110000110100110101101001101",2);
Run Code Online (Sandbox Code Playgroud)

或使用Long.valueOf

Long h1 = Long.valueOf("11000110000110100110101101001101",2);
Run Code Online (Sandbox Code Playgroud)