我不确定Java中的字符之间应该如何“正确”完成XORing。我见过其他人这样做,但是当我有一个简单的事情时:
char a = 'a';
char b = 'b';
char c = (char) a ^ b;
我收到“可能的从int到char的有损转换”的编译错误。我不确定在这种情况下如何引入int。
答案 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^98
是3
,但是就像a
和b
变量不是final
一样,它们可以在以后更改,因此编译器不接受将结果分配给char
。
使用常量值或将它们内联,就不需要任何强制转换:
final char a = 'a';
final char b = 'b';
char c = a ^ b;
否则,只有在您确定不会产生任何副作用的情况下,才能将XOR操作的结果缩小为char:
char c = (char) (a ^ b);