• ベストアンサー

【C言語】シフト演算による乗算

正の整数を二つ読み込み、乗算をシフト演算によって行いたいです。 プログラムを作ったのですが、動きません・・・。強制終了されます。 (例)53×25=53×(2^4+2^3+2^0)  =(53を左に4ビットシフト)+(53を左に3ビットシフト)+(53を左に0ビットシフト) http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4803.txt どこが悪いのでしょうか・・・。

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

s を戻り値で返すなら引数に s は必要ないです /*--- noの値をnoを越えない2のべき乗にする ---*/ int analyze(unsigned no) { unsigned i; int s = 0; for (i=2; i<no; i<<=1) /* iは2のべき乗 */ s++; return(s); /* noを越えない値は2^sである */ } でdivide関数のsを削除して count[k] = analyze(no); にすれば「値が代入される前に使われている(関数 divide)」とか言われなくてすみます。

rahal
質問者

お礼

ホントだ・・・・。 たしかにdivide関数でsはいらないですね・・・。 すいません、アホでした。ありがとうございます。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ん~ 開発に使った環境はなんでしょう? どこで落ちるのかデバッガでステップ実行してみましょう 当方の環境 VC6.0 / Borland C++5.02 どちらも強制終了にはなりませんでしたよ... 答えは 0でしたが また関数divideで引数kの値が変化することを mainが期待しているようですが int kでは期待に沿いません ポインタで渡してやらないと 呼び出し元には反映できませんよ または k自体を戻り値としてやるかです

rahal
質問者

補足

使った環境はbccです。 おっしゃるとおり、ポインタでアドレスを引き渡すことをしてなかったので・・・そこは直したんですが、次はこんな警告が出ました。 警告 W8013 test.c 26: 's' は、おそらく値が代入される前に使われている(関数 divide) どういう意味でしょうか・・・

関連するQ&A

専門家に質問してみよう