Java 字符之间的有损异或

Java lossy XOR between chars

我不确定在 Java 中的字符之间 "properly" 应该如何进行 XORing。我见过其他人这样做,但是当我遇到像这样简单的事情时:

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

我收到 "possible lossy conversion from int to char" 编译错误。我不确定如何将整数带入这种情况。

插入符号 (xor) 运算符适用于 int 值。您 char 变量和 b 被隐式提升为类型 int 以使其成为可能。该部分在不损失精度的情况下工作。

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

当您在 char 上使用 ^ 时,操作是在 char 的 int 值中完成的。

由于 operator precedence,演员表排在 ^ 之前。

这意味着它编译为

((char) a) ^ b

由于演员排在第一位,最后晋升为 int,您将尝试将 int 分配给 char

您想使用括号:

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

I'm not sure how ints are being brought into this context.

在您的示例中,两个字符的 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);