*を使わずに掛け算の結果を出すには?

解決


レイ  2001-11-26 01:25:06  No: 50010  IP: [192.*.*.*]

C言語で2つの整数の積を出す場合
*を使いますが、
それを使わずに
ビット演算子を使って結果を出したいのですが、
どうすればいいでしょうか?

編集 削除
新参  2001-12-08 02:50:53  No: 50011  IP: [192.*.*.*]

初めまして、新参と申します。

掛け算を筆算でやるとき,掛ける側を一桁ずつ計算して足しますよね。
同じ事を1ビット単位でやれば可能です。

[ex: 45 * 5]
45 = 0x2D = 00101101 B
 5 = 0x05 = 00000101 B
          ----------
            00101101
           00000000
          00101101
         00000000
        00000000
       00000000
      00000000
     00000000
     ---------------
     000000011100001 B = 0xE1 = 225

forループと +, << 演算子で計算可能です。
<< は乗算みたいなもんだから使っちゃダメということでしたら
(a + a) == (a << 1) ということで…。

long mlt(long a, long b)
{
  long data, bit;
  for( data = 0, bit = 1 ; bit ; bit <<= 1, a <<= 1 ) {
    if((b & bit) != 0)  data += a;
  }
  return  data;
}

編集 削除
新参  2001-12-08 02:53:44  No: 50012  IP: [192.*.*.*]

↑すいません。行頭のスペースは無視されるんですね。

> [ex: 45 * 5]
> ...
> 000000011100001 B = 0xE1 = 225

の部分は筆算を書いたつもりでしたが,無視してください。(^^;

編集 削除
レイ  2001-12-13 02:27:11  No: 50013  IP: [192.*.*.*]

新参さん
ありがとうございました。
やってみます。

編集 削除
xen  2006-03-28 08:13:55  No: 50014  IP: [192.*.*.*]

今更なんですが、この内容がいまいち理解できないので
説明してくれるかたいませんか?

編集 削除
Blue  2006-03-28 09:04:40  No: 50015  IP: [192.*.*.*]

> いまいち理解できないので
いまいちとか、曖昧すぎです。具体的にドコまでわからないのでしょうか?

C言語関係なしに、シフト演算については理解できていますか?

参考)
http://sinzo.web.infoseek.co.jp/joho/kodogozen/01kagaku/004/point004.htm

# プログラマにとって、基本情報技術者レベルの知識は持っていて当然ではないのでしょうか。。。?

編集 削除
xen  2006-03-28 09:25:18  No: 50016  IP: [192.*.*.*]

主にbitがどういう役割をしているかがちょっとわかりません。

編集 削除
Blue  2006-03-28 09:49:29  No: 50017  IP: [192.*.*.*]

具体的な値を入れてトレースしてみればわかると思いますよ。

11 × 5 の例)

    1011(=11)
×  0101(=5)
--------
  ↓

    1011
×  0001※
--------
    1011

  +

    1011
×  0100※
--------
  101100

  ↓
    1011(=11)
+101100(=44)
--------
  110111(=55)

※のところを求めるために使っている。

編集 削除
xen  2006-03-28 09:53:00  No: 50018  IP: [192.*.*.*]

わかりました。
わざわざありがとうございました。

編集 削除