【问题标题】:Java lossy XOR between chars字符之间的Java有损XOR
【发布时间】:2019-07-17 15:22:33
【问题描述】:

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

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

我收到“从 int 到 char 的可能有损转换”编译错误。我不确定整数是如何被带入这个上下文的。

【问题讨论】:

    标签: java types char xor


    【解决方案1】:

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

    由于operator precedence,演员阵容在^之前。

    这意味着它编译为

    ((char) a) ^ b
    

    由于演员排在第一位,int 的提升发生在最后,您将尝试将int 分配给char

    你想用括号:

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

    【讨论】:

    • 不错,我一开始忽略了那个微妙的细节 :-)
    • 谢谢!现在它实际上编译了!
    【解决方案2】:

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

    但是您的代码会强制将 int 值重新转换为 char 类型。您可以简单地使 c 类型为 int 来解决此问题,或者通过正确使用括号来解决。

    【讨论】:

    • 好的,谢谢!那么有没有办法对字符进行异或运算,因为我正在尝试对某些输入进行异或运算以用于加密目的
    • 不要处理字符。将它们转换为字节,并记住编码!
    【解决方案3】:

    我不确定整数是如何被带入这个上下文的。

    在您的示例中,两个字符的 XOR 可能可能重叠 char 类型的范围,因此编译器会为此语句生成一个 int。
    虽然这里不是这种情况,因为97^983,但就像ab 变量不是final,这些可以稍后更改,因此编译器不接受将结果分配给char.
    使用常量值或内联它们,你不需要任何转换:

    final char a = 'a';
    final char b = 'b';
    char c =  a ^ b;
    

    否则,只有在您确定不会产生任何副作用的情况下,才将 XOR 操作的结果缩小为一个字符:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 2018-04-27
      • 2016-03-18
      • 2015-01-16
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多