C言語で2つの整数の積を出す場合
*を使いますが、
それを使わずに
ビット演算子を使って結果を出したいのですが、
どうすればいいでしょうか?
初めまして、新参と申します。
掛け算を筆算でやるとき,掛ける側を一桁ずつ計算して足しますよね。
同じ事を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;
}
↑すいません。行頭のスペースは無視されるんですね。
> [ex: 45 * 5]
> ...
> 000000011100001 B = 0xE1 = 225
の部分は筆算を書いたつもりでしたが,無視してください。(^^;
新参さん
ありがとうございました。
やってみます。
今更なんですが、この内容がいまいち理解できないので
説明してくれるかたいませんか?
> いまいち理解できないので
いまいちとか、曖昧すぎです。具体的にドコまでわからないのでしょうか?
C言語関係なしに、シフト演算については理解できていますか?
参考)
http://sinzo.web.infoseek.co.jp/joho/kodogozen/01kagaku/004/point004.htm
# プログラマにとって、基本情報技術者レベルの知識は持っていて当然ではないのでしょうか。。。?
主にbitがどういう役割をしているかがちょっとわかりません。
具体的な値を入れてトレースしてみればわかると思いますよ。
11 × 5 の例)
1011(=11)
× 0101(=5)
--------
↓
1011
× 0001※
--------
1011
+
1011
× 0100※
--------
101100
↓
1011(=11)
+101100(=44)
--------
110111(=55)
※のところを求めるために使っている。
わかりました。
わざわざありがとうございました。
ツイート | ![]() |