C 使用XOR交换两个指针

C 使用XOR交换两个指针,c,swap,xor,C,Swap,Xor,我有一个关于使用XOR双交换双字符串文字的快速问题 因此,我有以下几点: #include <stdio.h> #include <stdlib.h> #include <string.h> void intSwap(int *a, int *b){ *a=*a^*b; *b=*a^*b; *a=*a^*b; } void swapString(char **a, char **b){ char *temp=*a;

我有一个关于使用XOR双交换双字符串文字的快速问题

因此,我有以下几点:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void intSwap(int *a, int *b){
    *a=*a^*b;
    *b=*a^*b;
    *a=*a^*b;
}


void swapString(char **a, char **b){
    char *temp=*a;
    *a=*b;
    *b=temp;
}

void main(){
    char *s= "ha";
    char *t= "Oh";

    printf("%s and %s \n",s,t); // prints ha Oh
    swapString(&s,&t);
    printf("%s and %s \n",s,t); // prints Oh ha


    int a=10;
    int b=5;
    printf("%d %d\n",a,b); //print 10 5
    intSwap(&a,&b);
    printf("%d %d\n",a,b); //print 5 10
}
如您所见,我使用了二进制操作XOR来处理intSwap。然而,当我尝试用交换做同样的事情时,它不起作用

我收到的错误消息是:二进制^1的无效操作数有'char*'和'char*'


您知道如何使用XOR交换两个字符串文本吗?在C语言中可能吗?谢谢你

如果使用C99或更高版本,则需要在操作前将char*强制转换为intptr\t,然后在操作后将其强制转换回char*

您的错误消息:

二进制^1的无效操作数包含“char*”和“char*”

告诉您,虽然概念正确,但运算符^对指针不起作用

请注意,如果您的目标是在不使用额外变量的情况下执行此操作,请注意,这在现代编译器上实际上并不更有效,您可以使用加减法来执行此操作,而加减法是指针非常支持的。详情请参阅


intptr_t是一种整数类型,用于保存指针值。注意intptr\t严格来说不是完全可移植的,可能没有可以容纳指针的整数类型。

指针上没有按位操作。唯一能作用于它们的算术运算是+和-以及它们的childer++、-、+=和-=。因此,在执行逐位运算和返回时,需要强制转换为intptr\t,或者最好是uintptr\t

void pointerXorSwap(int **x, int **y){
    uintptr_t a = (uintptr_t)*x;
    uintptr_t b = (uintptr_t)*y;

    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

    *x = (int*)a;
    *y = (int*)b;
}
无论如何,这是一个糟糕的做法,不会为你节省任何周期。编译器将使用简单的赋值识别交换,并为您进行优化。好的编译器甚至可以识别那些异或悲观,并将它们转换回更高效的MOV。如您所见,上述函数将编译为以下指令

pointerXorSwap(int**, int**):
        mov     rax, QWORD PTR [rdi]
        mov     rdx, QWORD PTR [rsi]
        mov     QWORD PTR [rdi], rdx
        mov     QWORD PTR [rsi], rax
        ret
*a=*b;表示将b的一个字符复制到a,而不是整个字符串。这同样适用于交换函数,因此这将产生错误的值


如果您对长度为1的字符串尝试相同的操作,这将起作用

我希望您不会在任何生产应用程序中使用此代码。如果您这样做了,您必须添加额外的逻辑以确保调用intSwap&a和&a不会把事情搞砸。为什么不简单地使用一个临时变量呢。通常更快。