字符之间的Java有损异或

问题描述 投票:3回答:3

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

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

我得到一个“从int到char的可能有损转换”编译错误。我不确定如何将这些内容纳入这种背景。

java types char xor
3个回答
4
投票

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

由于operator precedence,铸造在^之前。

这意味着它编译成

((char) a) ^ b

由于铸造是第一次,促进到int发生最后,你将尝试将int分配给char

你想使用括号:

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

2
投票

caret(xor)运算符处理int值。您将char变量和b隐式提升为int类型以使其成为可能。那部分工作不会损失精确度。

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


1
投票

我不确定如何将这些内容纳入这种背景。

在您的示例中,两个字符的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);
© www.soinside.com 2019 - 2024. All rights reserved.