2

のいくつかのメソッドを調べる必要があったためBigInteger、アセンブリに DotPeeked しました。そして、私はかなり奇妙なものを見つけました:

internal int _sign;

int数字の記号にan を使用するのはなぜですか? 理由はありませんか、それとも私が見逃しているものがありますか。BitArrayつまり、、boolまたは 、またはbyte. なぜintですか?

4

5 に答える 5

0

クラス オブジェクトのサイズは 32 ビット (4 バイト) に切り上げられるため、3 バイトを「節約」しても何も得られません。数値を保持する単語の 1 つからビットを盗むことによって、典型的な BigInteger のサイズから 4 バイトを削ることができるかもしれませんが、そのような使用に必要な余分な処理は、32 ビット整数を浪費するコストを上回ります。

より興味深い可能性はBigInteger、派生クラスPositiveBigIntegerとを持つ抽象クラスになる可能性がありNegativeBigIntegerます。すべてのクラス オブジェクトには、それがどのクラスであるかを示す単語があるため、このようなアプローチでは、作成される BigInteger ごとに 32 ビットを節約できます。このような方法で抽象クラスを使用すると、各関数呼び出しに追加の仮想メンバー ディスパッチが追加されますが、それらのほとんどで「if」テストを節約できる可能性があります (eg のメソッドはNegativeBigInteger、それらが呼び出されたという事実によって認識されるため)。これthisは陰性であり、テストする必要はありません)。このような設計は、TinyBigInteger(BigInteger値が単一の に収まる a Integer) およびSmallBigInteger(BigInteger値がLong)。マイクロソフトがそのような設計を検討したかどうか、またはトレードオフがどうなるかはわかりません。

于 2013-03-15T23:18:57.463 に答える
0

現在の System.Numerics.BigInteger オブジェクトの符号 (負、正、またはゼロ) を示す数値を取得します。

-1 このオブジェクトの値は負です。0 このオブジェクトの値は 0 (ゼロ) です。1 このオブジェクトの値は正です。

つまり

class Program
{        

    static void Main(string[] args)
    {            
        BigInteger bInt1 = BigInteger.Parse("0");
        BigInteger bInt2 = BigInteger.Parse("-5");
        BigInteger bInt3 = BigInteger.Parse("5");

        division10(bInt1);//it is Impossible
        division10(bInt2);//it is Possible : -2
        division10(bInt3);//it is Possible : 2       
    }

    static void division10(BigInteger bInt)
    {
        double d = 10;  

        if (bInt.IsZero)
        {
            Console.WriteLine("it is Impossible");
        }
        else
        {
            Console.WriteLine("it is Possible : {0}", d / (int)bInt);
        }
    }
}    

CLS が存在し、CLS がそれらをサポートしていないため、byte または別の uint、sbyte、ushort、short を使用しないでください。

于 2013-03-15T23:21:05.353 に答える