Frage Vergleichen von zwei Ganzzahlen ohne Vergleich


Ist es möglich, die größte von zwei Ganzzahlen ohne Vergleich zu finden? Ich habe einige Lösungen gefunden:

if(!(a/b)) // if a is less than b then division result will be zero.
{
    cout << " b is greater than a";
}
else if (!(a-b)) // we know a is greater than or equal to b now.  check whether they are equal.
{
    cout << "a and b are equal";
}
else
    cout << "a is greater than b";

Aber wenn (c) oder wenn (! C) ist ein Vergleich zu Null. Außerdem funktioniert es nicht für negative Zahlen. Tatsächlich brauche ich eine Lösung, die jede if-Anweisung vermeidet. Stattdessen sollte ich Switch-Anweisungen und arithmetische Operatoren verwenden. Danke.


11
2018-01-24 22:37


Ursprung


Antworten:


Subtrahieren Sie sie und überprüfen Sie das Schild mit fiesen Bit Twiddling Hacks
http://graphics.stanford.edu/~seander/bithacks.html

Tun Sie das nicht im Produktionscode, wenn die anderen Programmierer wissen, wo Sie leben.


35
2018-01-24 22:55



Hier ist eine lustige Bit-Twiddling-Version, die keine bedingten Zweige hat.

int g = (int)"greater";
int l = (int)"less";
int e = (int)"equal";

int a = 7;
int b = 10;

char *result = (char*)((((a - b) >> 31) & l) | (((b - a) >> 31) & g) | ((~((a - b) | (b - a))) >> 31) & e);
cout << result;

5
2018-01-24 23:32



Keine der in der Frage oder einer der Antworten bisher vorgestellten Stichproben schützt vor Zerlegung durch Null. Warum in aller Welt versuchst du, eine 'Wenn'-Aussage zu vermeiden? Ich vermute Hausaufgaben Frage über?: Betreiber.

cout << "Maximum is: " << ((a>b)?a:b)

Da gehen wir.

Es ist nicht möglich, zwei Zahlen ohne Vergleich zu vergleichen. Sie können es täuschen und eine indirekte Operation durchführen, aber am Ende des Tages vergleichen Sie etwas. Vertrauen Sie dem Compiler, um den Code zu optimieren und die besten Operationen auszuwählen.


2
2018-01-24 22:55



Sie könnten die Tatsache ausnutzen, dass das Zeichen der Berechnung ist a - b hängt davon ab, welche Zahl größer ist. Dies wird in vielen Implementierungen des Vergleichs verwendet. Aber ich glaube, dass Sie Vergleiche nie vollständig vermeiden können. In diesem Fall müssen Sie zumindest noch den Inhalt des Flags sign auf dem Prozessor auswerten.

Wenn Sie nur die niedrigere Zahl anzeigen müssen, können Sie auch arithmetische Tricks verwenden:

result = ((a + b) - sqrt((a - b) * (a - b))) / 2

BEARBEITEN ähm ... du darfst es benutzen switch?

Ich sollte Switch-Anweisungen und arithmetische Operatoren verwenden.

switch ist im Grunde das gleiche wie angekettet if und als solche verwendet es auch Vergleich. Das klingt, als ob Sie tatsächlich nur mit Null vergleichen sollten, um zu sehen, welches Zeichen a - b hat.


1
2018-01-24 22:58



char c;
c=0x3D + (!(b/a) && (a-b)) - (!(a/b) && (a-b));
printf("a %c b",c);

1
2018-01-24 23:21



(!(a/b) ?  cout << " b is greater than a" : (!(b-a) ? cout << "a and b are equal" :  cout << "a is greater than b") :  cout << "a is greater than b");

Das wird ein bisschen chaotisch

Edit: Ist das Hausaufgaben?


0
2018-01-24 22:41



Ich sehe keinen guten Grund dafür: Wer würde ohne "Wenn" programmieren wollen?

Eine mögliche Antwort ist:

((a + b) + abs (a - b)) / 2

Ich denke, "abs" versteckt nur ein "wenn" irgendwo, genau wie der ternäre Operator, der nur ein anderer Name für "wenn" ist ...


0
2018-01-24 22:51



Die perverse Idee: Verwenden Sie ein Array von Funktionszeigern. Dann erhalten Sie mit einigen arithmetischen und bitweisen Operationen einen Index in dieses Array.


0
2018-01-24 23:25



Als eine sinnlose Übung, hier ist ein Weg zur Umsetzung eines cond Funktion - dem Zweck dienen ifangenommen, es (und switch, und ?:) war irgendwie aus der Sprache verschwunden, und Sie benutzen C ++ 0x.

void cond(bool expr, std::function<void ()> ifTrue, std::function<void ()> ifFalse)
{
    std::function<void ()> choices[2] = { ifTrue, ifFalse };
    choices[expr == false]();
}

z.B.

cond(x > y,
    /*then*/ [] { std::cout << "x is greater than y"; },
    /*else*/ [] { std::cout << "x is not greater than y"; });

Wie ich sage, sinnlos.


0
2018-01-25 00:43



Probieren Sie es aus, testen Sie es, es funktioniert gut.

public static int compare(int a, int b)
{
    int c = a - b;
    return (c >> 31) & 1 ^ 1;
}

0
2017-10-14 18:24



Ich denke, diese Methode ist besser als andere, Sie können diese Logik c und Java beide Programmiersprachen verwenden, aber int sollte 4 Byte sein, wenn int von 2 Byte ist, dann 15 Byte richtige Verschiebung statt 31 Byte.

enter code here

#include<stdio.h>

main()
{
   int a, b;
   printf("Enter three numbers\n");
   scanf("%d %d", &a, &b);
   printf("Largest number is %d \n",findMax( a,b ));
}
int findMax( int x, int y)
{
  int z = x - y;
  int i  = (z  >>  31)  &  0x1;
  printf("i = %d shift = %d \n", i, (z>>31));
  int  max  =  x - i  *  z;
  return max;
}

0
2018-06-21 18:06