字符之间的Java有损XOR

时间:2019-02-23 19:54:07

标签: java types char xor

我不确定Java中的字符之间应该如何“正确”完成XORing。我见过其他人这样做,但是当我有一个简单的事情时:

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

我收到“可能的从int到char的有损转换”的编译错误。我不确定在这种情况下如何引入int。

3 个答案:

答案 0 :(得分:4)

^上使用char时,将以char的int值完成操作。

由于operator precedence,强制转换在^之前进行。

这意味着它可以编译为

((char) a) ^ b

由于首先进行了转换,所以对int的升级最后一次发生,您将尝试将int分配给char

您要使用括号:

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

答案 1 :(得分:2)

脱字号(xor)运算符处理int值。 char变量和b被隐式提升为int类型,以使之成为可能。该部分可以正常工作而不会损失精度。

但是随后您的代码将int值强制返回为char类型。您可以简单地使int类型的c来解决此问题,或者通过正确使用括号来解决。

答案 2 :(得分:1)

  

我不确定如何将int引入此上下文中。

在您的示例中,两个字符的XOR可能可能重叠在char类型的范围内,因此编译器会为此语句生成一个int。
尽管这里不是这样,因为97^983,但是就像ab变量不是final一样,它们可以在以后更改,因此编译器不接受将结果分配给char
使用常量值或将它们内联,就不需要任何强制转换:

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

否则,只有在您确定不会产生任何副作用的情况下,才能将XOR操作的结果缩小为char:

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