使用xor运算符时发生Java编译错误

使用xor运算符时发生Java编译错误,java,bit-manipulation,precision,Java,Bit Manipulation,Precision,我正在尝试用Java编写一个字符串反转函数,我知道我可以简单地调用一个现有函数,但我尝试这样做是为了练习和学习 public class HelloWorld{ public static void main(String []args){ String s = reverse("abcd"); System.out.println(s); } public static String reverse(String str){

我正在尝试用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; 
    }
}
我试过像你这样的演员

arr[end] = (char) arr[start] ^ arr[end];
没有解决问题。 这是怎么回事

    I have tried casting like
    arr[end] = (char) arr[start] ^ arr[end];
您只是在强制转换第一个字符,而不是另一个字符,因此将以字符的整数/十进制值而不是字符值本身给出xor的结果

样本:

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

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

试着用整个表情来表达:

arr[end] = (char) (arr[start] ^ arr[end]);
这很好:

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;
    }
}

在您的代码中,实际上您正试图在char类型变量中插入一个整数值。 当执行xor操作时,函数会隐式地将值转换为整数类型

考虑以下几点:

char a = 'x';
char b = 'y';
char c = a ^ b;  //Error!
之所以会发生这种情况,是因为编译器正在将字符类型a和b转换为整数类型,然后执行按位操作,即xor操作。返回的值将是整数类型。 要使其正常工作,必须显式强制转换操作的返回类型:

char c = (char) a ^ b;
i、 e.就你而言:

arr[start] = (char) arr[start] ^ arr[end];
你的问题很相似
char a = 'x';
char b = 'y';
char c = a ^ b;  //Error!
char c = (char) a ^ b;
arr[start] = (char) arr[start] ^ arr[end];