1

私は現在、BigIntegerのマグニチュード推定値を取得するために次のメソッドを使用しています。BigInteger.ToByteArray()の使用を必要としないメソッドを誰かが提案できるかどうか知りたいと思います。

 public static long MagnitudeEstimate(BigInteger value)
 {

     byte[] array = value.ToByteArray();

     if (array.Length == 0 || (array.Length == 1 && (array[0] == 0 || array[0] == 1)))
         return 0;
     else
         return (long)(array.Length * 2.408239965);
 }
4

4 に答える 4

1

2倍にキャストして対数を取ることは、それを行う簡単な方法の1つのように思えます。

Math.Log10((double)bigInt)

または単に組み込み

BigInteger.Log10(bigInt)

ベンチマークを行っていないので、どれくらい速いかわかりません。

于 2012-10-12T09:13:27.783 に答える
1

ハックなソリューション。私はこれを使いません。

BigInteger bi = new BigInteger(long.MaxValue);

var fieldInfo = typeof(BigInteger).GetField("_bits", BindingFlags.Instance | BindingFlags.NonPublic);

var arr = (uint[])fieldInfo.GetValue(bi);
var size =  arr.Length * sizeof(uint);
于 2012-10-12T09:51:47.170 に答える
0

私の元のバージョンとLBのバージョンの両方を組み合わせて、次のことに決めました。私の元のバージョンより速くはありませんが、より正確です。

皆様のご意見ありがとうございました。

public static long MagnitudeEstimate(BigInteger value)
{
      var fieldInfo = typeof(BigInteger).GetField("_bits", BindingFlags.Instance | BindingFlags.NonPublic);
      var arr = (uint[])fieldInfo.GetValue(value);
      if (arr != null)
      {
            int totalNumBytes = arr.Length * sizeof(uint);
            int zeroBytes = 0;
            for (int i = arr.Length - 1; i >= 0; i--)
            {
                  if (arr[i] == 0)
                  {
                        zeroBytes += 4;
                        continue;
                  }
                  else if (arr[i] <= 0xFF)
                        zeroBytes += 3;
                  else if (arr[i] <= 0xFFFF)
                        zeroBytes += 2;
                  else if (arr[i] <= 0xFFFFFF)
                        zeroBytes += 1;

                  break;
            }

            return (long)((totalNumBytes - zeroBytes) * 2.408239965);
      }
      else return 0;
}
于 2012-10-12T11:27:47.030 に答える
0

.NET Core 2.1以降、新しいAPIがあります。 public int GetByteCount (bool isUnsigned = false);

それは何もコピーせず、あなたの数の非常に正確な見積もりとして使用することができます。

于 2019-02-15T19:08:24.163 に答える