使用XOR交换值

时间:2015-09-28 20:06:22

标签: c# xor

这是在C ++和C#中交换值的有效方法。

blur

这是在C ++中交换值的有效方法。

X ^= Y;
Y ^= X;
X ^= Y;

但为什么这不适用于C#?

3 个答案:

答案 0 :(得分:1)

int X = 3;
X = X + X++; // X = 6;

int X = 3
X = X++ + X; // X = 7;

类似地:

int X = 3;
int Y = 5;
X = (Y ^= X ^= Y)^X; // X = 5

然而:

int X = 3;
int Y = 5;
X = X^(Y ^= X ^= Y); // X = 0

不幸的是:

X = X^(Y ^= X ^= Y)X ^= Y ^= X ^= Y

的等价物

答案 1 :(得分:0)

我检查了编译器生成的MSIL。在第一种情况下,一切正常 - 推x,推y,xor,pop x等。 在第二种情况下,它以push x,push y,push x,push y开始,并在最后一个xor中使用x的初始值结束:

ldloc.0
ldloc.1
ldloc.0
ldloc.1
xor
dup
stloc.0
xor
dup
stloc.1
xor
dup
stloc.0

答案 2 :(得分:0)

我尝试生成C ++代码的ASM,并在这里反编译.NET代码:

<强> ASM

mov eax, DWORD PTR _X$[ebp]
mov ecx, DWORD PTR _Y$[ebp]
mov edx, DWORD PTR [eax]
xor edx, DWORD PTR [ecx]
mov eax, DWORD PTR _X$[ebp]
mov DWORD PTR [eax], edx
mov ecx, DWORD PTR _Y$[ebp]
mov edx, DWORD PTR _X$[ebp]
mov eax, DWORD PTR [ecx]
xor eax, DWORD PTR [edx]
mov ecx, DWORD PTR _Y$[ebp]
mov DWORD PTR [ecx], eax
mov edx, DWORD PTR _X$[ebp]
mov eax, DWORD PTR _Y$[ebp]
mov ecx, DWORD PTR [edx]
xor ecx, DWORD PTR [eax]
mov edx, DWORD PTR _X$[ebp]
mov DWORD PTR [edx], ecx

从我对汇编的小知识中我认为这基本上是:

X ^= Y;
Y ^= X;
X ^= Y;

C#(使用JetBrains dotPeek生成)

int& local1 = @X;
int num1 = ^local1;
int& local2 = @Y;
int num2 = ^local2;
int num3 = X ^= Y;
int num4;
int num5 = num4 = num2 ^ num3;
^local2 = num4;
int num6 = num5;
int num7 = num1 ^ num6;
^local1 = num7;

不确定&,^,@的含义,但我认为这基本上是:

int xStartingValue = X;
X ^= Y;
Y ^= X;
X = xStartingValue ^ Y;