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
Швы законны для меня.