XOR дает неожиданный вывод в JAVA

Я пытаюсь реализовать конечные поля в JAVA, для которых мне нужно XOR два двоичных числа. Вот мой код:

            String lastdigits="1000110";
            int overflow=11;
            int lastdigitsint=Integer.parseInt(lastdigits);
            int result=(int) lastdigitsint^overflow;

Значение переменной 'overflow' равно 11, Когда я выполняю XOR для lastdigitsint с переполнением (=11), вывод должен быть 1000101. Однако код выводит 1095.

Может кто-нибудь объяснить, почему это происходит? Спасибо.

2 ответа

Вы не XORing числа, которые вы думаете, что XORing.

Вы XORING один миллион сто десять с одиннадцатью

XOR выполняется для бит двоичного представления этих двух чисел, поэтому вы XOR двоичных чисел 11110100001010101110 а также 1011что приводит к 11110100001010100101, Интересно то, что десятичное представление этого числа 1000101, который является точно двоичным представлением результата, который вы получите, если вы XOR двоичные числа 1000110 а также 11,

Decimal     Binary

1000110  == 11110100001010101110
                               ^
     11  == 00000000000000001011
            --------------------
1000101  == 11110100001010100101

Если вы хотите XOR двоичных чисел 1000110 а также 11, вы должны написать:

        String lastdigits="1000110";
        int overflow=3; // 11 in binary is 3 in decimal
        int lastdigitsint=Integer.parseInt(lastdigits,2);
        int result=(int) lastdigitsint^overflow;

Это даст вам десятичное число 69 (чье двоичное представление 1000101).

Это неправильно с самого начала

    String lastdigits="1000110";
    int lastdigitsint=Integer.parseInt(lastdigits);

последняя цифра будет 1000110 - это десять миллионов гонкондов и десять, поэтому двоичное представление сильно отличается от того, что вы ожидали. То, что вы хотите сделать, это просто:

int lastdigitsint=0b1000110;

это правильное двоичное целое число.

Так:

public static void main(String[] args) {
    String lastdigits = "1000110";
    int overflow = 0b11;
    int lastdigitsint = Integer.parseInt(lastdigits);
    int result = lastdigitsint ^ overflow;

    System.out.println("Dec:" + lastdigitsint);
    System.out.println("Dec:" + overflow);
    System.out.println("Dec:" + result);
    System.out.println("Bin" + Integer.toBinaryString(lastdigitsint));
    System.out.println("Bin" + Integer.toBinaryString(overflow));
    System.out.println("Bin" + Integer.toBinaryString(result));

    System.out.println("And now the proper way:");
    lastdigitsint = 0b1000110;
    result = lastdigitsint ^ overflow;

    System.out.println("Dec:" + lastdigitsint);
    System.out.println("Dec:" + overflow);
    System.out.println("Dec:" + result);
    System.out.println("Bin" + Integer.toBinaryString(lastdigitsint));
    System.out.println("Bin" + Integer.toBinaryString(overflow));
    System.out.println("Bin" + Integer.toBinaryString(result));
}

Результат:

Dec:1000110
Dec:3
Dec:1000109
Bin:11110100001010101110
Bin:11
Bin:11110100001010101101
And now the proper way:
Dec:70
Dec:3
Dec:69
Bin:1000110
Bin:11
Bin:1000101

Швы законны для меня.

Другие вопросы по тегам