Математически найдите значение Max без условного сравнения

У меня есть та же проблема при установке Доктора Времени (не от repos) на новой установке Ubuntu 13.10 GNOME x64.

Ваши комментарии сделали меня, чтобы исследовать и сделать это:

sudo apt-get install libqt4-sql
sudo apt-get install libqt4-gui

После этого ошибка не произошла.

18
задан IAbstract 26 March 2013 в 18:34
поделиться

9 ответов

нахождение не более двух переменных:

max = a - ((ab) & ((ab) >> 31))

где >> - побитовый сдвиг вправо (также называемый SHR или ASR в зависимости от подписи).

Вместо 31 вы используете количество битов, которое у ваших чисел минус один.

25
ответ дан 30 November 2019 в 06:02
поделиться

Это зависит от того, какой язык вы используете, но тернарный оператор может оказаться полезным.

Но тогда, если сможешь '

-1
ответ дан 30 November 2019 в 06:02
поделиться

Хммм. Я предполагаю, что НЕ, И и ИЛИ являются побитовыми? Если да, то для решения этой проблемы будет использоваться побитовое выражение. Обратите внимание, что A | B выдаст число> = A и> = B. Возможно, существует метод сокращения для выбора числа с наибольшим количеством битов.

Для расширения нам понадобится следующее, чтобы определить, является ли A (0) или B (1) больше.

таблица истинности:

0|0 = 0  
0|1 = 1
1|0 = 0
1|1 = 0

!A and B

, следовательно, даст индекс большего бита. Итак, сравните каждый бит в обоих числах, и если они различны, используйте приведенное выше выражение (Не A и B), чтобы определить, какое число было больше. Начните со старшего бита и продолжайте вниз по обоим байтам. Если у вас нет конструкции цикла, сравните каждый бит вручную.

Реализация «когда они разные»:

(A! = B) И (здесь моя логика)

2
ответ дан 30 November 2019 в 06:02
поделиться

попробуйте это (но будьте осторожны с переполнениями) (Код на C #)

    public static Int32 Maximum(params Int32[] values)
    {
        Int32 retVal = Int32.MinValue;
        foreach (Int32 i in values)
            retVal += (((i - retVal) >> 31) & (i - retVal));
        return retVal;        
    }
0
ответ дан 30 November 2019 в 06:02
поделиться

Если вы не можете доверять своей среде для создания соответствующих операций вне филиалов, когда они доступны, см. на этой странице , чтобы узнать, как действовать дальше. Обратите внимание на ограничение на диапазон ввода; используйте для операции более крупный целочисленный тип, если вы не можете гарантировать, что введенные вами данные подходят.

6
ответ дан 30 November 2019 в 06:02
поделиться

Используя только логические операции, оценку короткого замыкания и предполагая соглашение C о округлении до нуля, это можно выразить как:

int lt0(int x) {
    return x && (!!((x-1)/x));
}

int mymax(int a, int b) {
    return lt0(a-b)*b+lt0(b-a)*a;
}

Основная идея состоит в том, чтобы реализовать оператор сравнения, который будет return 0 или 1. Аналогичный трюк можно проделать, если ваш язык сценариев следует соглашению о округлении в сторону минимального значения, как это делает python.

3
ответ дан 30 November 2019 в 06:02
поделиться
#region GetMaximumNumber
/// <summary>
/// Provides method to get maximum values.
/// </summary>
/// <param name="values">Integer array for getting maximum values.</param>
/// <returns>Maximum number from an array.</returns>
private int GetMaximumNumber(params int[] values)
{
  // Declare to store the maximum number.
  int maximumNumber = 0;
  try
  {
    // Check that array is not null and array has an elements.
    if (values != null &&
        values.Length > 0)
    {
      // Sort the array in ascending order for getting maximum value.
      Array.Sort(values);

      // Get the last value from an array which is always maximum.
      maximumNumber = values[values.Length - 1];
    }
  }
  catch (Exception ex)
  {
    throw ex;
  }
  return maximumNumber;
}
#endregion
-2
ответ дан 30 November 2019 в 06:02
поделиться

Думаю, это будет самым простым, если нам удастся найти разницу между двумя числами (только величину без знака)

max = ((a+b)+|a-b|)/2;

где | ab | - величина разницы между a и b .

23
ответ дан 30 November 2019 в 06:02
поделиться
function Min(x,y:integer):integer;
  Var
   d:integer;
   abs:integer;
 begin
  d:=x-y;
  abs:=d*(1-2*((3*d) div (3*d+1)));
  Result:=(x+y-abs) div 2;
 end;
1
ответ дан 30 November 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: