Java с потерями XOR между символами - PullRequest
0 голосов
/ 23 февраля 2019

Я не уверен, как XORing должен "правильно" выполняться между символами в Java.Я видел, как другие делают это, но когда у меня есть что-то простое, например:

char a = 'a';
char b = 'b';
char c = (char) a ^ b;

, я получаю ошибку компиляции «возможное преобразование с потерями из int в char».Я не уверен, как вводятся целые числа в этом контексте.

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Когда вы используете ^ для char, операция выполняется в значении char int.

Из-за приоритета оператора приведение происходит перед ^.

Это означает, что он компилируется в

((char) a) ^ b

Поскольку приведение происходит первым, повышение до int происходит последним, и вы будете пытаться назначить int дляchar

Вы хотите использовать круглые скобки:

char c = (char) (a ^ b);
0 голосов
/ 23 февраля 2019

Я не уверен, как вводятся целые числа в этом контексте.

В вашем примере XOR двух символов может потенциально перекрывать диапазон значений.тип char, поэтому компилятор выдает int для этого оператора.
Хотя здесь это не так, поскольку 97^98 равно 3, но, как и переменные a и b, не являются final, они могутбудет изменено позже, и поэтому компилятор не согласится присваивать результат char.
Используйте постоянные значения или встроенные в них значения, и вам не понадобится приведение:

final char a = 'a';
final char b = 'b';
char c =  a ^ b;

В противном случае сужениерезультат операции XOR для символа, только если вы уверены, что это не создаст никакого побочного эффекта:

char c =  (char) (a ^ b);
0 голосов
/ 23 февраля 2019

Оператор каретки (xor) работает со значениями типа int.Вы переменные char и b неявно повышены до типа int, чтобы сделать это возможным.Эта часть работает без потери точности.

Но тогда ваш код возвращает значение int обратно в тип char.Вы можете просто сделать c типа int, чтобы исправить это, или используя правильные скобки.

...