29

私は解決できた問題に取り組んでいますが、最後の部分を除いてすべて-ビットごとの演算子を使用して乗算を行う方法がわかりません:

0*8 = 0

1*8 = 8

2*8 = 16 

3*8 = 24 

4*8 = 32

これを解決するためのアプローチをお勧めできますか?

4

8 に答える 8

50

任意の値を 2 の N 乗 (つまり 2^N) で乗算するには、ビットを N 回左にシフトします。

0000 0001 = 1 

times 4 = (2^2 => N = 2) = 2 bit shift : 0000 0100 = 4

times 8 = (2^3 -> N = 3) = 3 bit shift : 0010 0000 = 32

等..

除算するには、ビットを右にシフトします。

ビットは完全に 1 または 0 です - ビットの一部だけシフトすることはできません。したがって、乗算する数値が N の整数値を因数分解しない場合です。

since: 17 = 16  + 1 
thus:  17 = 2^4 + 1

therefore: x * 17 = (x * 16) + x in other words 17 x's  

したがって、17 を掛けるには、左に 4 ビット シフトしてから、元の数値を再度加算する必要があります。

==> x * 17 = (x * 16) + x 
==> x * 17 = (x * 2^4) + x 
==> x * 17 = (x shifted to left by 4 bits) + x 

so let x = 3 = 0000 0011 

times 16 = (2^4 => N = 4) = 4 bit shift : 0011 0000 = 48

plus the x (0000 0011)

すなわち。

    0011 0000  (48)  
+   0000 0011   (3)
=============
    0011 0011  (51)

編集:元の回答に更新します。Charles Petzold は、これらすべてを最も簡単な方法で説明する素晴らしい本「Code」を書きました。これを徹底的にお勧めします。

于 2010-09-15T21:39:09.737 に答える
15

乗算命令を使用せずに 2 つの 2 進数でエンコードされた数値を乗算します。製品に到達するために繰り返し追加するのは簡単です。

unsigned int mult(x, y)
unsigned int x, y;
{
    unsigned int reg = 0;

    while(y--)
        reg += x;
    return reg;
}

ビット操作を使用すると、データ エンコーディングの特性を利用できます。前に説明したように、ビット シフトは 2 倍することと同じです。これを使用すると、2 のべき乗で加算器を使用できます。

// multiply two numbers with bit operations

unsigned int mult(x, y)
unsigned int x, y;
{
    unsigned int reg = 0;

    while (y != 0)
    {
        if (y & 1)
        {
            reg += x;
        }
        x <<= 1;
        y >>= 1;
    }
    return reg;
}
于 2013-02-02T15:58:27.170 に答える
3

被乗数を 2 の累乗に因数分解します。
3*17 = 3*(16+1) = 3*16 + 3*1 ... = 0011b << 4 + 0011b

于 2010-09-15T21:54:42.013 に答える
1

これは左シフトであるべきだと思います。8 は 2^3 なので、3 ビット左にシフトします。

2 << 3 = 8

于 2010-09-15T21:46:41.677 に答える
0

これが前の回答と同じであることに気づきました。笑 ごめんなさい。

public static uint Multiply(uint a, uint b)
{
   uint c = 0;
   while(b > 0)
   {
      c += ((b & 1) > 0) ? a : 0;
      a <<= 1;
      b >>= 1;
   }
   return c;
}
于 2015-08-20T19:24:48.547 に答える
0
-(int)multiplyNumber:(int)num1 withNumber:(int)num2
{
    int mulResult =0;
    int ithBit;

    BOOL isNegativeSign = (num1<0 && num2>0) || (num1>0 && num2<0)   ;
    num1 = abs(num1);
    num2 = abs(num2);


    for(int i=0;i<sizeof(num2)*8;i++)
    {
        ithBit =  num2 & (1<<i);
        if(ithBit>0){
            mulResult +=(num1<<i);
        }

    }

    if (isNegativeSign) {
        mulResult =  ((~mulResult)+1 );
    }

    return mulResult;
}
于 2014-02-12T20:39:29.043 に答える