4

integer がnあり、ビット演算のみを使用して数値の下 2 桁を切り捨てたいと考えています。

したがって、通常の算術では、 と同じくらい簡単n /= 100です。しかし、これをビット演算でどのように行うのでしょうか?

ありがとう、

(ちなみにこれはC++です)

[編集]: たとえば、番号が与えられた場合、1234取得したいです12。(下2桁は切り捨て34)

[Edit2:] 質問を言い換えさせてください。負の入力が与えられたときに、数値の最後の 2 桁を切り捨てるはずの特定の関数が問題を起こす理由を理解しようとしています。(そして、私はこの関数のコードを持っていません)

入力のセットとそれに対応する出力は次のとおりです。

-200901 ==> 186113241

-200801 ==> 186113242

-200701 ==> 186113243

-200601 ==> 186113244

-190001 ==> 186113350

-190101 ==> 186113349

-190201 ==> 186113348

-190301 ==> 186113347

4

2 に答える 2

1

ここで、定数で割りたい : 100

次に、ビットシフトと加算のみを使用して乗算と除算を行うにはどうすればよいですか? Suraj Chandran のコメントで提供されたものです。

これを 1/100 の乗算として再解釈できます。

基数 2 では、1/100 は 1/2^7 * ( 1/2^0 + 1/2^2 + 1/2^6+ 1/2^7+ 1/2^8+ 1/ 2^9 + 1/2^11+ 1/2^13+ 1/2^14+ 1/2^15+ 1/2^20+ 1/2^22 + 1/2^26 + 1/2^ 27 + 1/2^28 1/2^29)

したがって、(n >> 0 + n >> 2 + n >> 6 + n >> 7 + n >> 8 + n >> 9 + n >> 11 + n >> 13 + n >> の近似があります。 14 + n >> 15 + n >> 20 + n >> 22 + n >> 26 + n >> 27 + n >> 28 + n >> 29) >> 7

これは多かれ少なかれレガシーコードにあるものですか?

ここでの近似の影響については精査しておらず、場合によっては丸めの問題が発生する可能性があるため、これが常に正しい答えを与えるとは言いません。

次のJavaコードでは

残り = (( n>>0 ) + (n >> 2) + (n >> 6) + (n >> 7) + (n >> 8) + (n >> 9) + (n >> 11 ) + (n >> 13) + (n >> 14) + (n >> 15) + (n >> 20) + (n >> 22) + (n >> 26) + (n >> 27) + (n >> 28) + (n >> 29)) >> 7;

http://ideone.com/8UlD7に例を追加

加算をビットごとの演算で置き換える方法が見つかりませんでした + 負の値で得られた結果を再現できませんでした

于 2012-05-30T20:18:33.827 に答える
0

わかりました、別のアプローチ。

1234 : 100 = 12, remainder 34

今バイナリで、私はそれを台無しにしないことを望みます:

 100 1101 0010 : 110 0100 = 1100 Result
- 11 0010 0
-----------
   1 1011 00
  -1 1001 00
  ----------
     0010 001
    -       0
    ---------
      010 0010
     -       0
     ---------
       10 0010 remaining

それをアルゴリズムに変換して楽しんでください。x /= 100どのようにやっても、地獄のように遅くなります。

于 2012-05-30T19:55:29.200 に答える