Nano Hash - криптовалюты, майнинг, программирование

Как поменять местами без третьей переменной?

Мне нужно поменять местами две переменные с числовым значением, не используя третью переменную. Какое простое решение?

17.03.2011


Ответы:


1

Давайте рассмотрим один из методов, а именно использование арифметических операторов. Рассмотрим 2 переменные, скажем, x = 50 и y = 70, и давайте посмотрим, как поменять местами значения двух переменных, то есть сделать x = 70 и y = 50, не используя третью переменную. Это можно сделать с помощью следующих арифметических операций, а именно:
x= x + y
y= x - y
x= x - y
Что дает
• x= x + y дает x= 70 + 50, поэтому x равно 120
• y= x - y дает y = 120 - 70, что делает значение y равным 50
• x= x - y дает x = 120 - 50 и, таким образом, значение x становится 70

17.03.2011
  • Что, если бы x или y были очень большими по сравнению с другими? 17.03.2011
  • это хорошее решение, но нужно быть осторожным с переполнением 17.03.2011
  • Ответьте на x -= y = (x += y) - y; и скажите учителю, что это один из самых глупых вопросов. 17.03.2011
  • @Amadan За исключением тех случаев, когда люди используют такие вещи в качестве каверзных вопросов во время интервью, как будто это действительно что-то доказывает ... :/ 03.06.2017

  • 2

    Вы можете добиться этого с помощью XOR

    int A = ...;
    int B = ...;
    A = A ^ B;
    B = A ^ B;
    A = A ^ B;
    
    17.03.2011
  • @ Бертран, я только что провел тест на разум и все еще считаю, что все в порядке. Если A равно B, в первом присваивании результатом A будет 0, затем B присваивается 0 XOR B, который является B, а затем A присваивается 0 XOR B, который снова является B (который был равен начальному A) . 17.03.2011
  • А=1, В=1. Шаг 1: А=А^В=1^1=0. Шаг 2: B=A^B=0^1=1. Шаг 3: А=А^В=0^1=1. Похоже, это работает для меня. 18.03.2011

  • 3

    В зависимости от типа переменной вы можете использовать Interlocked.Exchange . Это использует атомарную операцию для выполнения свопа.

    17.03.2011


    5

    Здесь у нас есть это на ассемблере MIPS. Первое решение длинное и плохое. Второй с XOR лучше.

    addi $t0, $0, -5
    addi $t1, $0, 15
    
    add $t0, $t0, $t1
    sub $t1, $t1, $t0
    nor $t1, $0, $t1
    addi $t1, $t1, 1
    sub $t0, $t0, $t1
    
    ####
    
    xor $t0, $t0, $t1
    xor $t1, $t0, $t1
    xor $t0, $t0, $t1
    
    17.03.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..