????

23 отговора 1073 прегледа
#1

????

mojete li da swapnete stoinostite na 2 promenlivi
bez da izpolzvate treta

soy un perdedor baby
Отговор
в отговор на bbwolf #2

Re: ????


#include <stdio.h>

int main( int argc, char *argv[] )
{
int a, b;

a = 10;
b = 3443;

a ^= b;
b ^= a;
a ^= b;

fprintf( stdout, "%d %d\n", a, b );
}


tirulirutatuutuu
Отговор
в отговор на malkia #3

Re: ????

evala man
ne 4e ti dreme ma mi se izdiga6 v o4ite ae sys zdrave
precaka na drugite pi4ove usiliqta ama ni6to

soy un perdedor baby
Отговор
в отговор на malkia #4

Re: ????

Туй хубаво, ама не върши винаги работа. Ако смениш променливите да са float/double, трябва да пренаписваш кода, понеже номерът вече не минава.

Отговор
в отговор на hoopla #5

Re: ????

of coz' u can


#include <stdio.h>

int main( int argc, char *argv[] )
{
float a, b;

a = 10.0;
b = 3443.0;

*(unsigned*)&a ^= *(unsigned*)&b;
*(unsigned*)&b ^= *(unsigned*)&a;
*(unsigned*)&a ^= *(unsigned*)&b;

fprintf( stdout, "%f %f\n", a, b );
}


e za double - trebe unsigned long long (gcc), ili __uint64 - ili na dwa pasa - abre jasna e ideata :)

tirulirutatuutuu
Отговор
в отговор на malkia #6

Re: ????

eto oshte edno reshenie - tamun mi doide na um w glavata... glavata... glavata...


#include <stdio.h>

int main( int argc, char *argv[] )
{
float a, b;

a = 10.0;
b = 3443.0;

a = a*b;
b = a/b;
a = a/b;

fprintf( stdout, "%f %f\n", a, b );
}


razbira se tva puk si ima ogranichenia za tipa - teoreticheski vjarno, prakticheski - neuodbno ;)

tirulirutatuutuu
Отговор
в отговор на bbwolf #7

Re: ????

i oshte edno, bbwolf - wse pak tema s nadpis "????" e trudno razlichaema i za snaiperist ;)

za obiknownenni kartechari e dobre da se napishe "razmjana na dve promenliwi bez izpolzwane na treta" - za snajpersita mozhe i "RNDPBINT"

tirulirutatuutuu
Отговор
в отговор на malkia #8

Re: ????

Това си личи, че набързо си го измислил.

1. Има опасност от overflow/underflow.

2. Ако a е 0, и b става 0, вместо да се разменят.

3. Ако b е 0 се получава FP exception - зорлем делене на нула.

Предното пък не е преносимо, понеже нямаш гаранция, че на всяка архитектура sizeof(unsigned int)==sizeof(float).

Като упражнения ги бива, стига някой да не се изкуши да ги сложи в pruduction code.

Отговор
в отговор на hoopla #9

Re: ????

малко майтап от мене, дори и спазвам условието и не използвам временна променлива (поне не пряко):

#include <algorithm>
//int a, b;

std::swap<int>(a, b);

идем из село мама ви мръсна
моята цел е гъзо да ви пръсна...
Отговор
в отговор на hoopla #10

Re: ????

vjarno e... suglasen sum - winagi kogato pravja swap izpolzwam treta promenliwa.
Wuprosa po-skoro beshe za "informatika" otkolkoto za "programisti". Za 0 se setih i az - ama reshih da ostavja toj sam da se bluska - obache ti kato opititen UNIX programist me hwana naburzo, cheerz ;)

Taka de - ama edva li ima drug nachin - da se razmenjat dve promenliwi bez izpolzwaneto na treta (pa znae li chovek?)

tirulirutatuutuu
Отговор
в отговор на malkia #11

Re: ????

b=(a+=b)-b;
a-=b;

pak ima opasnost ot overflow vse pak s + po maluk shans ot *

Отговор
в отговор на pm #12

Re: ????

eto oshte edin nachin, vqrno che eax moje da se broi za 3-ta promenliva :)

mov eax, a
xchg eax, b
mov a, eax

Отговор
в отговор на zliq #13

Re: ????

otkoga registrite pochnaha da se broiat za promenlivi

btw, ne vijdam kakvo tolkova mu se vuzhishtavash na malkia
tozi trik s xora e star kolkoto sveta..

Отговор
в отговор на edno momiche #14

Re: ????

vjarno e tova.

ama tozi sus izwazhdaneto, koeto pm pokaza ne go znaeh.

tirulirutatuutuu
Отговор
в отговор на malkia #15

Re: ????

dosta tupo e, xora e po burz

Отговор
в отговор на Penguin #17

Re: ????

az wse pak izpolzwam treta promenliwa - po-chetlivo, i razbiraemo e - i raboti za po-slozhni danni - klasove, strukturi i prochie. Mozhe bi dori e po-burzo - no spored men njama goljamo znachenie.

Edinstweno xor-a mozhe da e po-udoben - ako ti lipswa register.

tirulirutatuutuu
Отговор
в отговор на malkia #18

Re: ????

> az wse pak izpolzwam treta promenliwa - po-chetlivo, i razbiraemo e - i raboti
> za po-slozhni danni - klasove, strukturi i prochie. Mozhe bi dori e po-burzo - no
> spored men njama goljamo znachenie.
Естествено. _Всички_ ползват трета променлива. Останалите методи са за форумите на dir.bg. Така като гледам за да работи някакъв такъв метод за размяна на място трябват две неща.
1. Езика за програмиране да предоставя някаква операция спрямо която данните да образуват група (XOR, ADD, или даже MUL ако не смятаме нулата).
2. Езика за програмиране да предоставя възможност за намиране на инверсния елемент на даден, при това на място без да ползваме допълнителна променлива (XOR, SUB, DIV).
Що се отнася до скоростта, така или иначе поне интелската фамилия се движи в посока RISC, и подозирам че идеята е всичко да става за по един такт даже и MUL-а :-) Така че дали е XOR, ADD, или размяна през трета променлива, все тая.

Отговор
в отговор на Penguin #19

Ах да, още нещо

push dword ptr ds:[var_1]
push dword ptr ds:[var_2]
pop dword ptr ds:[var_1]
pop dword ptr ds:[var_2]

Отговор
в отговор на Penguin #20

Впрочем тук трябва доуточнение

Дали говорим за използване на променлива на ниво процесор или на ниво език за програмиране. Защото ако е второто, то това е изцяло въпрос на владеене на съответния синтаксис на езика. На C++ едно решение със шаблони което да реализиращо някоя обща inline функция е _начинът_ да се реши проблема. А на perl, имайки предвид възможностите му за работа със списъци, задачата директно преминава към разряда на неинтересните.

Отговор