2

cでビット演算を学びながら、ビット演算だけで2つの数を掛け合わせるコードを探していたら、こんなコードを発見!次のシナリオで三項演算子がどのように機能し、正しい o/p を生成するのか理解できません。

#include<stdio.h>
static int multiply (int x, int y) 
{
    return  y==0?0:((y&1) ==1?x:0)+multiply(x<<1,y>>1);
}
int main()
{
    printf("%d",multiply(2,3));
    return 0;
}

誰かが上記のコードがどのように機能しているのか説明してもらえますか?.

4

3 に答える 3

2

数値の加算に使用しているため、「ビット操作のみ」を使用していません+

インデントは複雑な式を分割するのに役立つかもしれません:

return (y == 0 ? 0
               : (y & 1) == 1 ? x
                              : 0)
       + multiply(x << 1, y >> 1);

基本的に、これは再帰的な加算であり、y0 に達すると停止します。 の最下位ビットyが設定xされている場合は結果に加算され、そうでない場合は加算されません。再帰のたびに、 の 1 ビットyが削除され、最終的に 0 になります。 の値はx、手で乗算を行う場合と同様に、左にシフトされます。

たとえば、x = 3(binary 11) とy = 6(binary 110) の場合、計算します

0 * 3 + 1 * 6 + 1 * 12 = 18

もちろん、18 は 3 * 6 です。

各再帰ステップは次のように記述されますa * baはそのステップでの最下位ビットy(左から読み取ると、y最下位ビットから始まるビットである 0、1、1 を取得します) であり、はそのステップでbの値です。x

于 2013-07-09T08:35:59.450 に答える
2

y が奇数の場合、x * y = x + (x * 2) * (y / 2)

y が偶数の場合、x * y = (x * 2) * (y / 2)

上記のロジックで、 まで再帰を使用しますy = 0

于 2013-07-09T08:45:40.033 に答える
1

条件演算子の複雑なネストされた使用法を理解するのに苦労している場合は、単純に if ステートメントに展開します。

static int multiply (int x, int y) 
{
    if (y==0)
        return 0;
    else
        return ((y&1) ==1?x:0)+multiply(x<<1,y>>1);
}

次に、内部条件演算子を展開します。

static int multiply (int x, int y) 
{
    if (y == 0)
        return 0;
    else if ((y&1) == 1)
        return x + multiply(x<<1, y>>1);
    else return
        return multiply(x<<1, y>>1);
}

このように展開すると、式が何をしているのかが明確になるはずです。

于 2013-07-09T08:35:50.307 に答える