- ベストアンサー
剰余演算を論理演算と加減算に置き換える方法
剰余(割算の余り)を求める演算を論理演算と加減算とビットシフトのみで行う方法がありましたら教えてください。 言語はC/C++ではなくても大丈夫です(ロジックだけでも)。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
私も割り算命令の無いCPU用にアセンブラで作ります。 符号ありは少し複雑なので、符号なしで・・・。 // x/yの余りを求める(8bit/8bitの余りの場合) unsigned char mod(unsigned char x, unsigned char y) { unsigned int a = x; unsigned int b = y; b <<= 7; for (int i = 0; i < 8; i++) { if (a >= b) { a -= b; } b >>= 1; } return (unsigned char)a; }
その他の回答 (3)
- tatsu99
- ベストアンサー率52% (391/751)
既に回答がでていますが、 スピードを無視したアルゴリズムですが、 下記の関数は、わり算を行って、商と余りを返す関数です。 // a / b を求める // 商はsho、余りはamariに格納される // a >= 0, b > 0が前提 void sub_dev(int a , int b , int *sho, int *amari){ *sho = 0; while(a >= b){ (*sho)++; a -= b; } *amari = a; } a>=0,b>0が前提です。(そうでない場合は誤動作します) int a = 10; int b = 3; int sho,amari; sub_deb(a,b,&sho,&amari);のように使います。 ところで、どうして剰余を求める時「論理演算と加減算とビットシフトのみで行う方法」が必要なのかということ自体に非常に興味があります。よろしければ、このような質問をされた理由を教えていただけませんでしょうか。
お礼
ありがとうございます。 No.4の回答にも書かれているのと同じような理由です。 実際はWindows搭載のコンピュータで実装しています。 したがって、%演算子を使えばいいのですが、 除算器と乗算器が無いものとして、実装を行いたいからです。 特に組込みのLSIを利用するものとして、作っています。 価格の都合で、あまり高価な回路にできないのだそうです。
- パんだ パンだ(@Josquin)
- ベストアンサー率30% (771/2492)
x÷yの商がa、余りがbだとすると x=ay+b ⇔ b=x-ay という形になるので、xからyをa回引けば余りになります。 余りだけなら、 xがyより小さければそのxが余り …(1) x=x-y (1)に戻る でいかがでしょう? 商も必要なら、繰り返しの回数を数えればいいと思います。 2進数ではどうなるかわかりませんが。
お礼
ありがとうございます。 引き算のループに落すということですね。
- arukamun
- ベストアンサー率35% (842/2394)
こういったロジックは小学校の算数に戻りましょう。 例) 136÷3= _045_ 3)136 _12_ 16 _15_ 1 これは10進数での計算ですね。 これを2進数で考えて見てください。 10001000÷00000011= _00101101_ 11)10001000 _011_ 101 _011_ 100 _011_ 100 _011_ 1 ビットシフトと加減算と比較しかしていませんよね。 がんばれぇ!
お礼
ありがとうございます。 まさに算数の考え方ですね。
お礼
質問の背景まで、察してくださるとは思いませんでした。 ありがとうございます。