Как можем да се погрижим за препълването, което се случва по време на размяната на две променливи, без да използваме трета променлива. Вярвам, че решението XOR може да се използва само за цели числа. какво ще кажете за другите типове променливи?
Препълване на стека по време на SWAP
Отговори (6)
Това не е отговор, но не се вписва в коментар.
При какви обстоятелства бихте работили толкова близо до ръба на наличното ви хранилище на стека, че допълнителното използване на временна променлива за суап ще ви създаде затруднения?
Мога да видя някои вградени сценарии, но ми е трудно да си представя сценарий, при който сте толкова ограничени в стековото пространство, че това би имало значение (където не пишете код на асемблер).
XOR ще работи за всичко, което можете да накарате вашия XOR оператор да обработи; това е свойство на двоични данни, а не на двоични данни, използвани за представяне на цели числа.
Като не го правя изобщо. Алгоритъмът за размяна на XOR е страхотен хак. Той не трябва да се използва в производствения код.
Решението XOR работи с всеки тип, който може да бъде побитово копиран, не само с цели числа. Въпреки това, не XOR променлива със себе си: т.е.
int x = 10;
int *p1 = &x;
int *p2 = p1;
*p1 = *p1 ^ *p2;
*p2 = *p1 ^ *p2;
*p1 = *p1 ^ *p2;
/* now x == 0 :( */
Какво не е наред с XCHG? Не е необходим стек, няма препълване (флаг за пренасяне)? задайте или :).
a = a + b;
b = a - b;
a = a - b;
Това ще работи за цели числа и float.