2012-11-25 10 views
12

ビットシフト演算子またはビット演算子のみを使用して、整数を別の整数(正の両方)で除算して剰余を得る方法を知りたい。 /オペレータまたは%オペレータは使用しないでください。剰余を得るためのビットシフト

たとえば、divisorが2^kの形式のときの剰余を得るには、次の操作で剰余が得られます。

m = Remainder

n = The number

d = The divisor

m = n & (d - 1)

dフォーム2^kである場合にのみ、しかし、この方法は機能します。私は2の非力のための同様の方法を知りたい。あなたは絶対に使用できない場合、私は現在、programming challengesから問題に取り組んで、オペレータ%を使用していない任意の答えはあまり効率的な答えになるプログラムの実行時間

+1

ビット表現がベース2のみに限られているという事実はありませんか?値43/7を考えてみましょう。値は実際には6.142857 ...です。ベースの値が2よりも高い場合、どのような一般的なアプローチが考えられますか? – Makoto

+5

一般的な方法はありません。あなたは除数を知っている場合、除算を乗算といくつかのシフトと加算/減算で置き換えることができます。有能なCコンパイラに問い合わせてください。そうすればコンパイル時定数の魔法の値が得られます。 –

+0

答えに1ビットシフトステートメントだけが含まれていない限り、私はあなたがjavas mod演算子を上回らないと確信しています。 – goat

答えて

1

を減らすために、このような方法を採用したいのですが、いオペレータ、そして、一つの解はnから繰り返しDを減算するループを使用することです:

m = n; 
while (m >= d) 
{ 
    m -= d; 
} 

あなたの整数は32ビットであることを仮定すると、あなたは私たちがn個からDの倍数を削除する最適化されたバージョンを考えることができます。

m = n; 
for (i = 31; i >= 0; i--) 
{ 
    di = d << i; 
    if (di > 0 && m >= di) m -= di; 
} 

この例では、整数が符号付きであり、オーバーフロー、すなわちdi > 0のテストを監視しているものとします。

+1

残念ながら、通常の2の補数のマシンを想定していても、オーバーフローするシフトが必ずしも負の数になるとは限りません。 –

関連する問題