У меня есть та же проблема при установке Доктора Времени (не от repos) на новой установке Ubuntu 13.10 GNOME x64.
Ваши комментарии сделали меня, чтобы исследовать и сделать это:
sudo apt-get install libqt4-sql
sudo apt-get install libqt4-gui
После этого ошибка не произошла.
нахождение не более двух переменных:
max = a - ((ab) & ((ab) >> 31))
где >> - побитовый сдвиг вправо (также называемый SHR или ASR в зависимости от подписи).
Вместо 31 вы используете количество битов, которое у ваших чисел минус один.
Это зависит от того, какой язык вы используете, но тернарный оператор может оказаться полезным.
Но тогда, если сможешь '
Хммм. Я предполагаю, что НЕ, И и ИЛИ являются побитовыми? Если да, то для решения этой проблемы будет использоваться побитовое выражение. Обратите внимание, что 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) И (здесь моя логика)
попробуйте это (но будьте осторожны с переполнениями) (Код на 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;
}
Если вы не можете доверять своей среде для создания соответствующих операций вне филиалов, когда они доступны, см. на этой странице , чтобы узнать, как действовать дальше. Обратите внимание на ограничение на диапазон ввода; используйте для операции более крупный целочисленный тип, если вы не можете гарантировать, что введенные вами данные подходят.
Используя только логические операции, оценку короткого замыкания и предполагая соглашение 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.
#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
Думаю, это будет самым простым, если нам удастся найти разницу между двумя числами (только величину без знака)
max = ((a+b)+|a-b|)/2;
где | ab |
- величина разницы между a
и b
.
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;