【发布时间】:2019-07-17 15:22:33
【问题描述】:
我不确定在 Java 中的字符之间应该如何“正确”完成异或运算。我见过其他人这样做,但是当我有一些简单的事情时:
char a = 'a';
char b = 'b';
char c = (char) a ^ b;
我收到“从 int 到 char 的可能有损转换”编译错误。我不确定整数是如何被带入这个上下文的。
【问题讨论】:
我不确定在 Java 中的字符之间应该如何“正确”完成异或运算。我见过其他人这样做,但是当我有一些简单的事情时:
char a = 'a';
char b = 'b';
char c = (char) a ^ b;
我收到“从 int 到 char 的可能有损转换”编译错误。我不确定整数是如何被带入这个上下文的。
【问题讨论】:
当您在char 上使用^ 时,操作在char 的int 值中完成。
由于operator precedence,演员阵容在^之前。
这意味着它编译为
((char) a) ^ b
由于演员排在第一位,int 的提升发生在最后,您将尝试将int 分配给char
你想用括号:
char c = (char) (a ^ b);
【讨论】:
插入符号 (xor) 运算符适用于 int 值。您 char 变量和 b 被隐式提升为 int 类型以使其成为可能。该部分可以在不损失精度的情况下工作。
但是您的代码会强制将 int 值重新转换为 char 类型。您可以简单地使 c 类型为 int 来解决此问题,或者通过正确使用括号来解决。
【讨论】:
我不确定整数是如何被带入这个上下文的。
在您的示例中,两个字符的 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);
【讨论】: