C 使用XOR交换两个指针
我有一个关于使用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;
#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不会把事情搞砸。为什么不简单地使用一个临时变量呢。通常更快。