Операция XOR и BitCount в Java для переменных Long возвращают java.lang.NumberFormatException

Я пытаюсь выполнить операцию XOR для двух 64-битных переменных Long в Java. Проблема в том, что он терпит неудачу, когда я добавляю более 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)
на java.lang.Long.parseLong(Long.java:631)

То же самое, если я удвою это (64 бита, что я хотел бы вычислить):

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

Любая помощь в том, почему это не работает выше 16 бит?


person c1377554    schedule 11.10.2019    source источник
comment
Long.parseLong(String) равно parseLong(s, 10),   -  person meng    schedule 11.10.2019
comment
Документация по parseLong(String): анализирует строковый аргумент как длинное десятичное число со знаком. (не двоичный)   -  person user85421    schedule 11.10.2019


Ответы (2)


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);
person Eran    schedule 11.10.2019
comment
Спасибо. Но это не работает для 64 бит: long h1 = Long.parseLong(1100110000111000011010011011010011010011100001101001101101001101, 2); long h2 = Long.parseLong(1101110000111000011010011011010011011000011010011010001101000001, 2); Возвращает ту же ошибку... - person c1377554; 11.10.2019
comment
@ c1377554 ну, вы не можете передать более 63 бит. Старший бит в long является битом знака, а parseLong не принимает строку с дополнением до 2. Если вы хотите разобрать отрицательное число, вы должны передать число, состоящее не более чем из 63 бит, с префиксом «-». - person Eran; 11.10.2019

Преобразуйте эту двоичную строку в число, а затем выполните 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;
    }
}
person Vinit Chauhan    schedule 11.10.2019