我正在尝试对Java中的两个64位长变量进行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");
我收到一个错误:
线程"main"中的异常 java.lang.NumberFormatException: 对于输入字符串:"11000110000110100110101101001101">
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65(at java.lang.Long.parseLong(Long.java:592(at java.lang.Long.parseLong(Long.java:631(
如果我将其加倍(我想要计算的 64 位(,则相同:
Long h1 = Long.parseLong("1100011100011000011010011010110100110110000110100110101101001101");
Long h2 = Long.parseLong("1100001110001100001101001101011010011011100001101001101101000001");
关于为什么这会在 16 位以上失败的任何帮助?
Long.parseLong("11000110000110100110101101001101")
尝试将String
解析为十进制数,并且此数字太大,无法容纳在long
变量中。
要将String
解析为二进制数,您需要指定基数:
Long.parseLong("11000110000110100110101101001101",2);
顺便说一句,Long.parseLong
返回一个long
,所以我要么将其分配给long
:
long h1 = Long.parseLong("11000110000110100110101101001101",2);
或使用Long.valueOf
:
Long h1 = Long.valueOf("11000110000110100110101101001101",2);
将此二进制字符串转换为数字,然后执行 XOR。 比如转换 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;
}
}