2

こんにちは、カスタムのバイナリ整数除算方法を使用しようとしています: ソース: http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=642

public static void DivMod (Int128 dividend, Int128 divisor, out Int128 quotient, out  Int128 remainder)
{
// Determine the sign of the results and make the operands positive.
int remainderSign = 1;
int quotientSign = 1;
if (dividend < 0)
{
    dividend = -dividend;
    remainderSign = -1;
}
if (divisor < 0)
{
    divisor = -divisor;
    quotientSign = -1;
}
quotientSign *= remainderSign;

quotient = dividend;
remainder = 0;
for (int i = 0; i < 128; i++)
{
    // Left shift Remainder:Quotient by 1
    remainder <<= 1;
    if (quotient < 0)
        remainder._lo |= 1;
    quotient <<= 1;

    if (remainder >= divisor)
    {
        remainder -= divisor;
        quotient++;
    }
}

// Adjust sign of the results.
quotient *= quotientSign;
remainder *= remainderSign;
}
  • ただし、2 つの問題があります。

1) Int128 ではなく 32 ビット整数に使用したいと思います。したがって、Int128をintに置き換え、 (int i = 0; i < 128 ; i++) をi < 32;に置き換える必要があると想定しています。. 正しい?

2) 残り._lo |= 1 -> この行は C# ではまったく機能しません。彼らが使用するカスタム 128 ビット int 構造体に関係していると思いますが、それが何を意味するのかわかりません。誰かがこれを手伝ってくれて、int32 で動作するように翻訳できますか?

編集:ビットごとの演算子が何をするかを明確にするために、問題の部分は次のとおり です。このプロパティが何を指しているのかわかりません。また、この行の目的や、int32 にどのように変換されるのかもわかりません。

4

2 に答える 2

0
  1. 32 ビット整数 ( System.Int32) で使用するには、Int128 を int に、for ループの 128 を 32 に置き換えることができます。これは正しいことです。

  2. _loプロパティは、128 ビット数の下位 64 ビットです。.NET の最大の整数型は 64 ビット ( System.Int64) であるため、これが使用されます。したがって、32 ビットでは、プロパティを省略できます。
    remainder |= 1;

質問で指定したリンクをたどって数ページ戻ると、Int128構造体の実際の実装が見つかります。ここから始まります

于 2012-07-22T12:19:42.257 に答える
0

ガイドのこのページで説明されています。

public struct Int128 : IComparable, IFormattable, IConvertible, IComparable<Int128_done>, IEquatable<Int128_done>

{
  private ulong _lo;
  private long _hi;

  public Int128(UInt64 low, Int64 high)
  {
    _lo = low;
    _hi = high;
  }
}

32 ビット整数では無視して、単にsome32int |= 1.

彼は、ビットごとに 1 回ループするように言っているので、32 ビット整数では 32 回しかループしません。

于 2012-07-22T12:21:29.737 に答える