アプリ版:「スタンプのみでお礼する」機能のリリースについて

剰余(割算の余り)を求める演算を論理演算と加減算とビットシフトのみで行う方法がありましたら教えてください。

言語はC/C++ではなくても大丈夫です(ロジックだけでも)。

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

質問の背景まで、察してくださるとは思いませんでした。
ありがとうございます。

お礼日時:2004/09/08 19:56

既に回答がでていますが、


スピードを無視したアルゴリズムですが、
下記の関数は、わり算を行って、商と余りを返す関数です。
// 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);のように使います。
ところで、どうして剰余を求める時「論理演算と加減算とビットシフトのみで行う方法」が必要なのかということ自体に非常に興味があります。よろしければ、このような質問をされた理由を教えていただけませんでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます。

No.4の回答にも書かれているのと同じような理由です。
実際はWindows搭載のコンピュータで実装しています。
したがって、%演算子を使えばいいのですが、
除算器と乗算器が無いものとして、実装を行いたいからです。
特に組込みのLSIを利用するものとして、作っています。
価格の都合で、あまり高価な回路にできないのだそうです。

お礼日時:2004/09/08 19:45

x÷yの商がa、余りがbだとすると


x=ay+b ⇔ b=x-ay
という形になるので、xからyをa回引けば余りになります。
余りだけなら、

xがyより小さければそのxが余り …(1)
x=x-y
(1)に戻る

でいかがでしょう?
商も必要なら、繰り返しの回数を数えればいいと思います。
2進数ではどうなるかわかりませんが。
    • good
    • 0
この回答へのお礼

ありがとうございます。
引き算のループに落すということですね。

お礼日時:2004/09/08 19:39

こういったロジックは小学校の算数に戻りましょう。



例)
136÷3=

 _045_
3)136
 _12_
   16
  _15_
    1

これは10進数での計算ですね。
これを2進数で考えて見てください。
10001000÷00000011=

  _00101101_
11)10001000
  _011_
     101
    _011_
      100
     _011_
        100
       _011_
          1

ビットシフトと加減算と比較しかしていませんよね。
がんばれぇ!
    • good
    • 0
この回答へのお礼

ありがとうございます。
まさに算数の考え方ですね。

お礼日時:2004/09/08 19:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!