12

比較せずに 2 つの整数の最大値を見つけることは可能ですか? 私はいくつかの解決策を見つけました:

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";

しかし、if(c) または if(!c) はゼロとの比較です。さらに、負の数に対しては機能しません。実際、ifステートメントを回避するソリューションが必要です。代わりに、switch ステートメントと算術演算子を使用する必要があります。Xさん。

4

15 に答える 15

42

それらを減算し、厄介なビットいじりハックを使用して符号を確認します
http://graphics.stanford.edu/~seander/bithacks.html

他のプログラマーがあなたの居場所を知っている場合は、本番コードでこれを行わないでください。

于 2009-01-24T22:55:35.767 に答える
4

これは、条件分岐のない楽しいビットいじりバージョンです。

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;
于 2009-01-24T23:32:07.723 に答える
1

これまでのところ、質問で提示されたサンプルや回答のいずれも、ゼロ除算から保護されていません。いったいなぜ「if」ステートメントを避けようとしているのですか? ?: 演算子に関する宿題の質問を疑っています。

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

では行きましょう。

比較なしで 2 つの数値を比較することはできません。ごまかして間接的な操作を行うことはできますが、結局のところ、何かを比較していることになります。コンパイラを信頼してコードを最適化し、最適な操作を選択してください。

于 2009-01-24T22:55:31.400 に答える
1

計算の符号はa - bどちらの数値が大きいかによって決まるという事実を利用することができます。これは、比較の多くの実装で使用されます。しかし、比較を完全に避けることは決してできないと思います。この場合、少なくともプロセッサの符号フラグの内容を評価する必要があります。

より低い数値を表示する必要がある場合は、算術トリックを使用することもできます。

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

EDIT erm … 使用を許可されていますswitchか?

switch ステートメントと算術演算子を使用する必要があります。

switch基本的に連鎖ifと同じであり、比較も使用します。これは、実際にゼロと比較して、符号が何であるかを確認する必要があるかのように聞こえますa - b

于 2009-01-24T22:58:11.050 に答える
1
char c;
c=0x3D + (!(b/a) && (a-b)) - (!(a/b) && (a-b));
printf("a %c b",c);
于 2009-01-24T23:21:01.583 に答える
0
(!(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");

それは少し面倒になりますが

編集:これは宿題ですか?

于 2009-01-24T22:41:38.790 に答える
0

これを試して、テストして、うまくいきます。

public static int compare(int a, int b)
{
    int c = a - b;
    return (c >> 31) & 1 ^ 1;
}
于 2013-10-14T18:24:53.620 に答える
0

それを行う正当な理由がわかりません。「if」なしでプログラミングしたいのは誰ですか?

可能な答えは次のとおりです。

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

「abs」は「if」の別の名前である三項演算子と同じように、「if」をどこかに隠しているだけだと思います...

于 2009-01-24T22:51:37.523 に答える
0

ひねくれたアイデア: 関数ポインターの配列を使用します。次に、いくつかの算術演算とビット単位の演算で、その配列へのインデックスを取得します。

于 2009-01-24T23:25:53.693 に答える
0

この方法は他の方法よりも優れていると思います。このロジックは c と Java の両方のプログラミング言語で使用できますが、int が 2 バイトの場合、int は 4 バイトである必要があり、31 バイトではなく 15 バイトを右シフトします。

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;
}
于 2016-06-21T18:06:52.823 に答える
0

X と Y が 2 つの入力であるとします。X>Y は ((X+Y)+ abs(XY))/2 となり、X<Y は ((X+Y)- abs(XY))/2 となります。

#include<math.h> から abs() を取得できるようになりました。これは実際には絶対値を返します。

乾杯!

于 2020-12-12T03:19:01.100 に答える
0

無意味な演習として、ここにcond関数を実装する方法があります - の目的を果たすために、それ (および、および) が何らかの形で言語から消え、C++0x を使用しているifと仮定します。switch?:

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

例えば

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

私が言うように、無意味です。

于 2009-01-25T00:43:41.570 に答える
-2
void greater(int a, int b) {
    int c = a - b;
    switch(c) {
        case 0:
            cout << "a and b are equal" << endl;
            break;
        default:
            int d = c & (1<<31);
            switch(d) {
                case 0:
                    cout << "a is bigger than b" << endl;
                    break;
                default:
                    cout << "a is less than b" << endl;
            }
    }
}
于 2009-01-24T23:07:07.147 に答える