のいくつかのメソッドを調べる必要があったためBigInteger
、アセンブリに DotPeeked しました。そして、私はかなり奇妙なものを見つけました:
internal int _sign;
int
数字の記号にan を使用するのはなぜですか? 理由はありませんか、それとも私が見逃しているものがありますか。BitArray
つまり、、bool
または 、またはbyte
. なぜint
ですか?
のいくつかのメソッドを調べる必要があったためBigInteger
、アセンブリに DotPeeked しました。そして、私はかなり奇妙なものを見つけました:
internal int _sign;
int
数字の記号にan を使用するのはなぜですか? 理由はありませんか、それとも私が見逃しているものがありますか。BitArray
つまり、、bool
または 、またはbyte
. なぜint
ですか?
クラス オブジェクトのサイズは 32 ビット (4 バイト) に切り上げられるため、3 バイトを「節約」しても何も得られません。数値を保持する単語の 1 つからビットを盗むことによって、典型的な BigInteger のサイズから 4 バイトを削ることができるかもしれませんが、そのような使用に必要な余分な処理は、32 ビット整数を浪費するコストを上回ります。
より興味深い可能性はBigInteger
、派生クラスPositiveBigInteger
とを持つ抽象クラスになる可能性がありNegativeBigInteger
ます。すべてのクラス オブジェクトには、それがどのクラスであるかを示す単語があるため、このようなアプローチでは、作成される BigInteger ごとに 32 ビットを節約できます。このような方法で抽象クラスを使用すると、各関数呼び出しに追加の仮想メンバー ディスパッチが追加されますが、それらのほとんどで「if」テストを節約できる可能性があります (eg のメソッドはNegativeBigInteger
、それらが呼び出されたという事実によって認識されるため)。これthis
は陰性であり、テストする必要はありません)。このような設計は、TinyBigInteger
(BigInteger
値が単一の に収まる a Integer
) およびSmallBigInteger
(BigInteger
値がLong
)。マイクロソフトがそのような設計を検討したかどうか、またはトレードオフがどうなるかはわかりません。
現在の 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 を使用しないでください。