【问题标题】:Java compilation error while using xor operator使用 xor 运算符时出现 Java 编译错误
【发布时间】:2014-08-08 05:30:03
【问题描述】:

我正在尝试用 Java 编写一个字符串反转函数(我知道我可以简单地调用一个现有函数,但我正在尝试这样做来练习和学习)

public class HelloWorld{

    public static void main(String []args){
        String s = reverse("abcd");
        System.out.println(s);

    }
    public static String reverse(String str){
        int end = str.length() - 1;
        int start = 0;

        char[] arr = str.toCharArray();
        while (start < end)
        {
            arr[start] =  arr[start] ^ arr[end];

            arr[end] = arr[start] ^ arr[end];

            arr[start] = arr[start] ^ arr[end];

            start++;
            end--;
        }
        String ret = new String(arr);
        return ret; 
    }
}

但是,它给了我这些错误:

HelloWorld.java:16: error: possible loss of precision
            arr[start] =  arr[start] ^ arr[end];
                                     ^
  required: char
  found:    int
HelloWorld.java:18: error: possible loss of precision
            arr[end] = arr[start] ^ arr[end];
                                  ^
  required: char
  found:    int
HelloWorld.java:20: error: possible loss of precision
            arr[start] = arr[start] ^ arr[end];
                                    ^
  required: char
  found:    int
3 errors

我尝试过像这样的投射

arr[end] = (char) arr[start] ^ arr[end];

没有解决问题。 这是怎么回事?

【问题讨论】:

标签: java bit-manipulation precision


【解决方案1】:
    I have tried casting like
    arr[end] = (char) arr[start] ^ arr[end];

您只投射第一个 char 而不是另一个,因此在integer/decimal value 中为您提供xor 的结果,而不是char value 本身。

样本:

相反,您可以将其包裹在括号中,并将操作结果转换为 char。

(char) (arr[start] ^ arr[end]);

【讨论】:

    【解决方案2】:

    尝试转换整个表达式:

    arr[end] = (char) (arr[start] ^ arr[end]);
    

    【讨论】:

      【解决方案3】:

      这工作正常:

      public class HelloWorld {
          public static void main(String[] args) {
              String s = reverse("abcd");
              System.out.println(s);
          }
      
          public static String reverse(String str) {
               int end = str.length() - 1;
              int start = 0;
      
              char[] arr = str.toCharArray();
              while (start < end) {
                  arr[start] = (char) (arr[start] ^ arr[end]);
      
                  arr[end] = (char) (arr[start] ^ arr[end]);
      
                  arr[start] = (char) (arr[start] ^ arr[end]);
      
                  start++;
                  end--;
              }
              String ret = new String(arr);
              return ret;
          }
      }
      

      输出:

      dcba
      

      【讨论】:

        【解决方案4】:

        实际上,在您的代码中,您正试图在 char 类型变量中插入一个整数值。
        执行异或运算时,会将值隐式转换为整数类型。

        arr[start] =  arr[start] ^ arr[end];
        

        考虑以下几点:

        char a = 'x';
        char b = 'y';
        char c = a ^ b;  //Error!
        

        这是因为编译器将字符类型 ab 转换为整数类型,然后执行按位运算,即异或运算。返回值将是整数类型。
        要使其正常工作,您必须显式转换操作的返回类型:

        char c = (char) a ^ b;
        

        即在你的情况下:

        arr[start] = (char) arr[start] ^ arr[end];
        

        【讨论】:

          猜你喜欢
          • 2018-05-16
          • 2013-11-29
          • 2016-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多