Frage

---------- Aktualisiert ------------

codymanix und Mondschatten wurden bisher eine große Hilfe. Ich konnte mein Problem mit den Gleichungen lösen und stattdessen Rechtsverschiebung der Verwendung von I geteilt durch 29. Da mit 32bits unterzeichnet 2 ^ 31 = überläuft bis 29. Welche funktioniert!

Prototype in PHP

$r = $x - (($x - $y) & (($x - $y) / (29)));

Die tatsächliche Code für Leitungen (Sie können nur eine tun mathematische Funktion PRO LINE !!! AHHHH !!!)

DERIVDE1 = IMAGE1 - IMAGE2;
DERIVED2 = DERIVED1 / 29;
DERIVED3 = DERIVED1 AND DERIVED2;
MAX = IMAGE1 - DERIVED3;

---------- Original Question -----------
Ich glaube nicht, das ist durchaus möglich, mit Einschränkungen meiner Anwendung aber ich dachte, es ist ein Versuch wert zu fragen.

Ich werde versuchen, diese einfach zu machen. Ich brauche den Max-Wert zwischen zwei Zahlen zu finden, ohne in der Lage, einen IF oder eine bedingte Anweisung zu verwenden.

Um die die MAX-Werte zu finden, kann ich nur die folgenden Funktionen ausführen

Divide, Multiply, Subtract, Add, NOT, AND ,OR

Lassen Sie uns sagen, ich habe zwei Zahlen

A = 60;
B = 50;

Nun, wenn A immer größer ist als B wäre es einfach sein, den maximalen Wert finden

MAX = (A - B) + B;
ex. 
10 = (60 - 50)
10 + 50 = 60 = MAX

Das Problem ist A nicht immer größer als B. ich nicht ABS durchführen kann, MAX, MIN oder bedingte Kontrollen mit dem Scripting applicaiton ich verwende.

Gibt es eine Möglichkeit möglich, den eingeschränkten Betriebes unter Verwendung der oben einen Wert zu finden, in unmittelbarer Nähe des max?

War es hilfreich?

Lösung

Suche nach dem Maximum von 2 Variablen:

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

, wo >> ist bitweise Verschiebung nach rechts (auch SHR oder ASR, Auswuchten Signedness genannt).

Statt 31 verwenden Sie die Anzahl der Bits Ihre Zahlen haben minus eins.

Andere Tipps

Ich denke, das eine wäre die einfachste, wenn es uns gelingt Differenz zwischen zwei Zahlen zu finden (nur der Betrag nicht unterschreiben)

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

Dabei gilt |a-b| eine Größe Unterschied zwischen a und b.

Wenn Sie nicht Ihre Umgebung vertrauen können die entsprechenden branchless Operationen zu erzeugen, wenn sie verfügbar sind, finden Sie unter diese Seite für das weitere vorgehen. Man beachte die Beschränkung Eingangsbereich; verwenden, um einen größeren Integer-Typen für den Betrieb, wenn Sie nicht Ihre Eingaben garantieren können, passen.

Lösung ohne conditionals. Cast uint zu int dann zurück zu bekommen abs.

int abs (a) { return (int)((unsigned int)a); }
int max (a, b) { return (a + b + abs(a - b)) / 2; }

int max3 (a, b, c) { return (max(max(a,b),c); }

Verwendung von logischen Operationen nur, Kurzschluss-Auswertung und unter der Annahme der Konvention C gegen Null der Rundung ist es möglich, dies auszudrücken als:

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

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

Die Grundidee ist es, einen Vergleichsoperator zu implementieren, die zurückkehren 0 oder 1. Es ist möglich, einen ähnlichen Trick zu tun, wenn Ihre Skriptsprache macht die Konvention der Rundung auf den Boden Wert wie Python folgt.

Hmmm. Ich gehe davon aus NOT, AND und OR sind bitweise? Wenn ja, gibt es wird ein bitweise Ausdruck sein, dies zu lösen. Beachten Sie, dass A | B eine Zahl> = A geben und> = B. Vielleicht gibt es eine Beschneidung Methode für die Nummer mit den Bits auswählen.

zu verlängern, müssen wir folgendes bestimmen, ob A (0) oder B (1) größer ist.

Wahrheitstabelle:

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

!A and B

Daher wird der Index des größeren Bit geben. Ergo, zu vergleichen, um jedes Bit in den beiden Zahlen, und wenn sie unterschiedlich sind, verwenden Sie den obigen Ausdruck (nicht A und B) zu bestimmen, welche Zahl größer war. Starten Sie von der höchstwertigen Bits und Bytes gehen beide nach unten. Wenn Sie kein Konstrukt Looping haben, manuell jedes Bit vergleichen.

Implementierung "wenn sie anders sind":

(A! = B) und (meine Logik hier)

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;

versuchen diese, (aber bewusst sein, bei Überflutungen)  (-Code in 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;        
    }

Sie können dies ausdrücken als eine Reihe von arithmetischen und bitweise Operationen, z.

int myabs(const int& in) {
  const int tmp = in >> ((sizeof(int) * CHAR_BIT) - 1);
  return tmp - (in ^ tmp(;
}

int mymax(int a, int b) {
    return ((a+b) + myabs(b-a)) / 2;
}

Sie bitte auf diesem Programm aussehen .. Dies könnte die beste Antwort bis heute auf dieser Seite ...

#include <stdio.h>

int main()
{
    int a,b;
    a=3;
    b=5;
    printf("%d %d\n",a,b);
    b = (a+b)-(a=b); // this line is doing the reversal
    printf("%d %d\n",a,b);
    return 0;
}
//Assuming 32 bit integers 
int is_diff_positive(int num)
{
    ((num & 0x80000000) >> 31) ^ 1; // if diff positive ret 1 else 0
}
int sign(int x)
{
   return ((num & 0x80000000) >> 31);
}

int flip(int x)
{
   return x ^ 1;
}

int max(int a, int b)
{
  int diff = a - b;

  int is_pos_a = sign(a);
  int is_pos_b = sign(b);

  int is_diff_positive = diff_positive(diff);
  int is_diff_neg = flip(is_diff_positive);

  // diff (a - b) will overflow / underflow if signs are opposite
  // ex: a = INT_MAX , b = -3 then a - b => INT_MAX - (-3) => INT_MAX + 3
  int can_overflow = is_pos_a ^ is_pos_b;
  int cannot_overflow = flip(can_overflow);
  int res = (cannot_overflow * ( (a * is_diff_positive) + (b * 
            is_diff_negative)) + (can_overflow * ( (a * is_pos_a) + (b * 
            is_pos_b)));

  return res;

}

Es hängt davon ab, welche Sprache Sie verwenden, aber der Ternary Operator könnte nützlich sein.

Aber dann, wenn Sie nicht an Bedingungen geknüpft Kontrollen in Ihrer Scripting-Anwendung "durchführen können, werden Sie wahrscheinlich den ternären Operator nicht haben.

  

Wenn A immer größer als B ist .. .. [können wir verwenden] MAX = (A - B) + B;

Kein Bedarf. Nur Verwendung: int maxA(int A, int B){ return A;}

(1) Wenn conditionals dürfen Sie max = a>b ? a : b tun.

(2) Jede andere Methode verwendet entweder eine definierte Menge von Zahlen oder verlassen sich auf den impliziten bedingten Kontrollen.

(2a) max = a-((a-b)&((a-b)>>31)) das ist ordentlich, aber es funktioniert nur if Sie 32-Bit-Zahlen verwenden. Sie können es beliebig große Anzahl N erweitern, aber die Methode schlägt fehl, wenn Sie versuchen, max zu finden (N-1, N + 1). Dieser Algorithmus arbeitet für endliche Automaten, aber nicht eine Turing-Maschine.

(2b) Magnitude |a-b| ist eine Bedingung |a-b| = a-b>0 a-b : b-a

Was ist mit:
eingeben Bild Beschreibung hier

Die Quadratwurzel ist auch eine Bedingung. Jedes Mal, wenn c>0 und c^2 = d wir zweite Lösung -c haben, weil (-c)^2 = (-1)^2*c^2 = 1*c^2 = d. Quadratwurzel kehrt die größte in dem Paar. Ich komme mit einem eingebauten int max(int c1, int c2){return max(c1, c2);}

Ohne Vergleichsoperator Mathematik ist sehr symmetrisch als auch in Kraft begrenzt. Positive und negative Zahlen nicht ohne if irgendeine Art zu unterscheiden.

#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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top