2015-09-28 3 views
4

Это допустимый способ обмена значениями на C++ и C#.Значения свопинга с XOR

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

И это допустимый способ обмена значениями на C++.

X ^= Y ^= X ^= Y; 

Но почему это не работает в C#?

+2

Что не работает ? Как ты это используешь? –

+0

Какая ошибка заключается в компиляторе? – Lorek

+0

@Lorek Ошибка компилятора, он просто не меняет значения. – juharr

ответ

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

0

Я проверил MSIL, сгенерированный компилятором. В первом случае все нормально - нажмите x, нажмите y, xor, pop x и т. Д. Во втором случае он начинается с нажатия x, нажмите y, нажмите x, нажмите y и закончите с использованием начального значения x в последний исключающее:

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

Я пытался генерировать ASM в C++ код и декомпиляции кода .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; 

 Смежные вопросы

  • Нет связанных вопросов^_^