C 使用异或交换产生铁结果
这是一个奇怪的错误,我得到了一个简单的选择排序 使用以下输入C 使用异或交换产生铁结果,c,C,这是一个奇怪的错误,我得到了一个简单的选择排序 使用以下输入89,52,10,1,56,63,24,36,12,5 如果您要调试它,您会注意到在第三次迭代中 a[i]=a[i]^a[min]将两个操作数都设置为零 知道为什么会这样吗 #include<stdio.h> int main() { int a[10]={'\0'}; int i=0,j=0,k=0; int min=0; printf("Enter 10 Elements\n");
89,52,10,1,56,63,24,36,12,5
如果您要调试它,您会注意到在第三次迭代中
a[i]=a[i]^a[min]代码>将两个操作数都设置为零
知道为什么会这样吗
#include<stdio.h>
int main()
{
int a[10]={'\0'};
int i=0,j=0,k=0;
int min=0;
printf("Enter 10 Elements\n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<10;i++)
{
min=i;
for(j=i+1;j<10;j++)
{
if(a[j]<a[min])
{
min=j;
}
}
a[i]=a[i] ^ a[min];
a[min]= a[min] ^ a[i];
a[i]= a[i] ^ a[min];
}
for(i=0;i<10;i++)
{
printf("\n %d",a[i]);
}
return(0);
}
#包括
int main()
{
int a[10]={'\0'};
int i=0,j=0,k=0;
int min=0;
printf(“输入10个元素\n”);
对于(i=0;iXOR)来说,交换变量是一种糟糕的方式。只需声明一个临时变量并使用赋值即可
异或技巧:
x = x ^ y;
y = y ^ x;
x = x ^ y;
如果x
和y
在内存中的位置相同,则失败;然后将该值设置为0
我没有详细分析您的代码,但我敢打赌:
a[i]=a[i] ^ a[min];
a[min]= a[min] ^ a[i];
a[i]= a[i] ^ a[min];
当i==min
时失败
确认后,我尝试使用添加的printf
语句运行该程序,并且使用指定的输入,它至少与I==min
交换一次。XOR是交换变量的糟糕方法。只需声明临时并使用赋值即可
异或技巧:
x = x ^ y;
y = y ^ x;
x = x ^ y;
如果x
和y
在内存中的位置相同,则失败;然后将该值设置为0
我没有详细分析您的代码,但我敢打赌:
a[i]=a[i] ^ a[min];
a[min]= a[min] ^ a[i];
a[i]= a[i] ^ a[min];
当i==min
时失败
确认后,我尝试使用添加的printf
语句运行程序,并使用指定的输入,它至少与I==min
交换一次。当两个指针指定相同的内存位置时,程序将失败。这称为内存别名。当两个指针指定相同的内存loca时否则,程序将失败。这称为内存混叠。你说得对,当i==min时,它会失败。两个操作数都设置为零有什么特殊原因吗?赋值运算符不应该只将新值赋值给[i],而不影响[min]的值吗…不是。问题是,如果x
和y
是同一个对象,x=x^y
同时修改x
和y
。任何与自身异或的数字都是零。交换两个变量的方法是tmp=x;x=y;y=tmp;
(您还可以调整算法,使其不会不必要地尝试将元素与自身交换;这不一定是错误,但会造成浪费。)哦,好的..我以前一直使用临时变量交换方法,但是听说这是一种更有效的交换变量的方法,因为它没有额外变量的内存开销..所以只编写了一个程序来测试它..但是无论如何,谢谢..我会坚持使用临时变量进行测试..)使用xor交换两个变量是非常聪明的,从“聪明”这个词的不好的意义上说。如果它使程序不正确,那么额外的效率是毫无价值的。此外,在任何实现寄存器重命名的CPU上(并非所有CPU都这样做,但如果您关心的是性能而不是代码密度或电源效率,那么您可能正在使用一个),XOR技巧将变慢。你是对的,当i==min时失败,两个操作数都设置为零有什么特殊原因吗?赋值运算符不应该只将新值赋值给[i]而不影响[min]的值吗…不是。问题是,如果x
和y
是同一个对象,x=x^y
同时修改x
和y
。任何与自身异或的数字都是零。交换两个变量的方法是tmp=x;x=y;y=tmp;
(您还可以调整算法,使其不会不必要地尝试将元素与自身交换;这不一定是错误,但会造成浪费。)哦,好的..我以前一直使用临时变量交换方法,但是听说这是一种更有效的交换变量的方法,因为它没有额外变量的内存开销..所以只编写了一个程序来测试它..但是无论如何,谢谢..我会坚持使用临时变量进行测试..)使用xor交换两个变量是非常聪明的,从“聪明”这个词的不好的意义上说。如果它使程序不正确,那么额外的效率是毫无价值的。此外,在任何实现寄存器重命名的CPU上(并非所有CPU都这样做,但如果您关心的是性能而不是代码密度或电源效率,那么您可能正在使用一个),XOR技巧将变得更慢。