我不确定如何在Java中的字符之间“正确”完成XORing。我见过其他人这样做,但当我有一些简单的事情:
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);
caret(xor)运算符处理int值。您将char变量和b隐式提升为int类型以使其成为可能。那部分工作不会损失精确度。
但是然后你的代码强制int值返回char类型。您可以简单地使用int类型的c来解决此问题,或者通过正确使用括号。
我不确定如何将这些内容纳入这种背景。
在您的示例中,两个字符的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);