We were unable to load Disqus. If you are a moderator please see our troubleshooting guide.

G
Join the discussion…

- ##### in this conversation

⬇ Drag and drop your images here to upload them.

###### Log in with

###### or sign up with Disqus or pick a name

Please access our Privacy Policy to learn what personal data Disqus collects and your choices about how it is used. All users of our service are also subject to our Terms of Service.

- Peter Moroz 11 years ago

  однажды меня подвел такой способ.

  see more
  Show more replies
- G
  Guest 11 years ago

  a = a ^ b
  b = a ^ b

  see more
  Show more replies
- L
  Leo B. 12 years ago edited

  a ^= b ^= a ^= b; - это трюкачество не лучше i=i++;

  int swapadd(int a, int b) {
  a ^= b ^= a ^= b;
  return a+b;
  }
  gcc -Wall -c swap.c

  swap.c: In function ‘swapadd’:
  swap.c:2: warning: operation on ‘a’ may be undefined
  Не надо детям плохое советовать. :)

  see more
  - Александр Mod Leo B. 12 years ago

    Да, хотя на многих компиляторах работает, все-таки из-за отсутствия точки следования это unpredictable behavior.

    see more
    Show more replies
  Show more replies
- S
  Shtirlic 13 years ago

  http://wmate.ru/ebooks/book...

  see more
  Show more replies
- T
  theonewho 14 years ago

  на питоне получилось так (меньше — быстрее):
  с использованием разницы/суммы - 74 у.е.
  с использованием третьей переменной - 47 у.е.
  с использованием xor - 81 у.е.
  Может, конечно, особенности питона. Надо попробовать на сях.

  see more
  Show more replies
- T
  theonewho 14 years ago

  Но, видали. А как думаете (а может кто опыт ставил) по производительности какой из трёх вариантов победит? (третий с дополнительной переменной)

  see more
  Show more replies
- А
  Александр 14 years ago

  i1ey: Да, проверить на то, что а и b разные переменные не мешает, но это критично для любой функции обмена. В большинстве случаев разумно проверить, чтобы не гонять данные впустую.

  see more
  Show more replies
- I
  i1ey 14 years ago

  Если a и b -- это ссылки на одну и ту же переменную, то приведённый код (я о втором варианте) обнулит её. В общем, я бы дважды подумал перед тем, как использовать такое на практике.

  see more
  Show more replies
- V
  vashik 14 years ago

  Первый пример грозит целочисленным переполнением.

  see more
  Show more replies
- [
  [k06a] 14 years ago

  xander_prowler, кстати считал в calc.exe в Win7))
  Там теперь есть режим "Программист".
  Пруфпик: http://yfrog.com/jw123rmp

  see more
  Show more replies
- [
  [k06a] 14 years ago

  Александр, время от времени почитываю там некоторые бит-хаки)) Работают мгновенно.

  see more
  Show more replies
- [
  [k06a] 14 years ago

  xander_prowler, никакой разницы нет вроде. С этим проблемы могут быть только в джаве имхо . . . Ведь переменные "зациклены" так сказать.
  char a = 127, b = 28;
  a = a + b; // станет a = -101, b = 28
  b = a - b; // станет a = -101, b = 127
  a = a - b; // станет a = 28, b = 128
  Ведь signed/unsigned - всего лишь способ трактовки двоичного значения. А операции + и - выполняются именно для двоичных значений.

  see more
  Show more replies
- А
  Александр 14 years ago

  Отличная ссылка, спасибо.

  see more
  Show more replies
- [
  [k06a] 14 years ago

  Вот ещё интересные способы:
  http://graphics.stanford.ed...

  see more
  Show more replies
- V
  Vyacheslav 14 years ago

  Попался мне этот вопрос на интервью. Только формулировка была другой: "Как поменять содержимое двух ячеек, не используя третьей?" Индус с гордостью показал мне арифметическое решение, после чего я доказал что на самом деле эти операции задействуют больше двух ячеек (дебаг на ассемблере все объясняет).

  see more
  Show more replies
- А
  Александр 14 years ago

  xander_prowler: Первый пример чисто книжный.

  see more
  Show more replies
- X
  xander_prowler 14 years ago

  Первый вариант, кстати, не гарантирует выполнение операции если а = 32767

  see more
  Show more replies
- А
  Александр 14 years ago

  Да, похоже лучше в одну строчку не писать. Спасибо за совет.

  see more
  Show more replies
- W
  wecanstoptrain 14 years ago

  Александр: Да, операции выполняются справа налево, но стандарт не определяет, что будет лежать в переменной "a" после выполнения данного выражения.
  здесь все разжевано:
  http://alenacpp.blogspot.co...

  see more
  Show more replies
- W
  wecanstoptrain 14 years ago

  Вернее undefined:
  http://www.open-std.org/jtc...

  see more
  Show more replies
- А
  Александр 14 years ago

  wecanstoptrain: Язык С/C++. А почему unspecified behavior? Операции присваивания выполняются справа налево. Точно также, как бы они были записаны в три строки.

  see more
  Show more replies
- R
  R-ride 14 years ago

  wecanstoptrain, тогда разбей на три операции=)

  see more
  Show more replies
- W
  wecanstoptrain 14 years ago

  Уточнил бы язык. Может, на каком-то C# это и прокатит, но на C/C++ - это unspecified behavior

  see more
  Show more replies
- A
  Alex 14 years ago

  Прикольно, конечно, но зачем ?
  Напомнило "изврат" с определением минимального из двух чисел:
  min (a, b) ::= (a + b - ABS (a - b))/2
  Конечно, if не используется, но каково придется тому, кто такое будет потом читать :)

  see more
  Show more replies

Load more comments