- ベストアンサー
【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 どこが悪いのでしょうか・・・。
- みんなの回答 (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)」とか言われなくてすみます。
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
ん~ 開発に使った環境はなんでしょう? どこで落ちるのかデバッガでステップ実行してみましょう 当方の環境 VC6.0 / Borland C++5.02 どちらも強制終了にはなりませんでしたよ... 答えは 0でしたが また関数divideで引数kの値が変化することを mainが期待しているようですが int kでは期待に沿いません ポインタで渡してやらないと 呼び出し元には反映できませんよ または k自体を戻り値としてやるかです
補足
使った環境はbccです。 おっしゃるとおり、ポインタでアドレスを引き渡すことをしてなかったので・・・そこは直したんですが、次はこんな警告が出ました。 警告 W8013 test.c 26: 's' は、おそらく値が代入される前に使われている(関数 divide) どういう意味でしょうか・・・
お礼
ホントだ・・・・。 たしかにdivide関数でsはいらないですね・・・。 すいません、アホでした。ありがとうございます。