![]() |
Pascal. Меняем две переменных местами.
Однажды подошел ко мне друг и спросил, как поменять две переменных местами, я не задумываясь ответил: введем третью перенную "c" и проведем такие вот действия:
c:=a; a:=b; b:=c; Тогда он спросил, как это сделать без введения третьей переменной. После минуты раздумья я вот что сказал: a:=a+b; b:=a-b; a:=a-b; Но на вопрос, как сделать это в две операции я ответить не смог. Тогда он мне показал: a:=a xor b; b:=b xor a; Вроде так. Я знаю, что операция xor означает "исключающее или", но забавно, что и переменные местами меняет и быстро и непонятно. :fool: |
Цитата:
Странно... что то не стыкуется в этом методе. Допустим берем две величины а=1FH и b=7H... тогда согласно этим операциям мы получаем в итоге a=18H и b=1F... в случае с b это конечно сработало, но с величиной a какая то неувязочка выходит :confused: . Или это только в паскале работает? Хотя не должно, буленова математика стандартна для всех. :this: |
Не прав ты, wary.
Цитата:
В две операции обменять значения невозможно. Ты пытался привести здесь такой код: var X1, X2: Byte; begin X1 := X1 xor X2; X2 := X1 xor X2; // X2 = X1 X1 := X1 xor X2; // X1 = X2 end. Это самый быстрый способ обмена. И самый красивый. Чтоб понять, как это работает, советую посидеть с ручкой и листочком и вручную проверить. |
На самом деле работает вот так:
a=1;b=2; a=a xor b;//a=3 b=2 b=a xor b;//a=3 b=1 a=a xor b;//a=2 b=1 |
А в C++ можно в одну строчку:
a=b+(b=a)-a; |
Этот вопрос задают на всех собеседованиях)))
|
есть у архитектуры x386 интересная команда xchg.... меняет значения двух источников местами:
Код:
_asm { |
Напомню все началось с Pascal )) А вы уже в ассемблер залезли.
|
Прикольно. А я про xor ничего не знал. Приду в субботу на информатику, поуминичаю :)
|
Часовой пояс GMT +3, время: 12:58. |
Powered by vBulletin
Copyright ©2000-2025, Jelsoft Enterprises Ltd.