Мне любопытно узнать, что на самом деле происходит при поразрядном сравнении, используя бинарные литералы. Я просто наткнулся на следующую вещь:Поведение побитового xor с использованием бинарных литералов
byte b1 = (new Byte("1")).byteValue();
// check the bit representation
System.out.println(String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0'));
// output: 00000001
System.out.println(b1^0b00000001);
// output: 0
Так что все ведет себя, как и ожидалось, xor
сравнение равна 0
. Однако при попытке же с отрицательным числом он не будет работать:
byte b2 = (new Byte("-1")).byteValue();
// check the bit representation
System.out.println(String.format("%8s", Integer.toBinaryString(b2 & 0xFF)).replace(' ', '0'));
// output: 11111111
System.out.println(b2^0b11111111);
// output: -256
я ожидал бы, что последнее xor
сравнение также равна 0
. Однако это только в том случае, если я делать явное приведение из двоичного литерала byte
:
byte b2 = (new Byte("-1")).byteValue();
// check the bit representation
System.out.println(String.format("%8s", Integer.toBinaryString(b2 & 0xFF)).replace(' ', '0'));
// output: 11111111
System.out.println(b2^(byte)0b11111111);
// output: 0
Для меня это выглядит, что перед xor
сравнения как b1
и 0b11111111
имеют одинаковое представление битов, так что даже если они литой до int
(или что-то еще) xor
должен по-прежнему равняться 0
. Как вы попадаете в результат -256
, который является 11111111 11111111 11111111 00000000
в двоичном представлении? Почему я должен сделать явный листинг до byte
, чтобы получить 0
?
Те целые литералы, записанные в двоичной системе счисления. Более того, бинарные операторы продвигают свои операнды. –
Хорошо! Поэтому я вижу, что происходит: '0b11111111' является двоичным представлением' 255' и на самом деле является целым числом. Таким образом, 'b2' получает значение в' int', которое (от построения) равно '-1'. Итак, что происходит, это побитовое 'xor'' -1' и '255' (в 32-битном представлении), которое дает' -256'. Если я сделаю cast '(byte) 0b11111111', то сравнение будет выполнено без приведения в' int', но только для 8 бит обоих выражений. Правильно? –