2013-03-15 3 views
2

BigInteger에서 몇 가지 방법을 살펴볼 필요가있어서 어셈블리에 DotPeeked했습니다.부호에 int를 사용하는 요점은 무엇입니까?

internal int _sign; 

왜 당신이 사용하는 것 인 int 숫자의 부호에 대한 : 그리고 나는 오히려 이상한 뭔가를 발견? 아무런 이유가 없거나 내가 빠진 것이 있습니다. 즉, BitArray 또는 bool 또는 byte을 사용할 수 있습니다. 왜 int일까요?

+0

말하기 어렵다. '타입'이 다른 타입보다 나은 이유는 많이 있습니다. – Greg

+2

정렬은 아마도 어쨌든 32 비트 경계에 'bool'또는 'byte'를 강제합니다. – Joey

+0

@ 그렉 나는 그것이 'BigInteger'에 있다고 말했다. –

답변

2

,이 같은 일을 찾을 수 있습니다 :

if ((this._sign^other._sign) < 0) 
    return this._sign >= 0 ? 1 : -1; 

기본적으로 int 유형은 곱셈을 사용하여 두 값의 표시를 비교할 수 있습니다. 분명히 byte이나 bool도 허용되지 않습니다.

아직도 질문이 있습니다. 왜 Int16을 사용하면 적은 메모리를 소비합니까? 이것은 아마 정렬과 연결되어 있습니다.

+0

정렬 된 정수는 약간의 추가 공간을 차지하지만 다른 정수를 곱하거나 비교할 때 및 어셈블리 크기와 정렬이 중요 할 때 성능이 눈에 띄게 향상 될 수 있습니다. –

1

부호를 int로 저장하면 기호를 단순히 곱하여 계산 결과에 적용 할 수 있습니다. 더 간단한 유형으로 변환 할 때 이것은 유용 할 수 있습니다.

1

부울은 2 개의 상태 만 가질 수 있습니다. int 형의 장점은 이제 특수 값을 추적하는 간단 것입니다 : 같은 0

public bool get_IsZero() 
{ 
    return (this._sign == 0); 
} 

그리고 몇 가지 더 바로 가기 당신이 코드의 나머지 부분을 읽을 때. 당신은 디 컴파일 코드 _sign 필드의 용도 중 일부를 보면

0

모든 클래스 개체의 크기는 32 비트 (4 바이트)로 반올림되므로 3 바이트를 절약하면 아무 것도 구입하지 않습니다. 숫자를 저장하는 단어 중 하나에서 비트를 훔쳐 일반 BigInteger 크기에서 4 바이트를 줄일 수 있지만 이러한 사용에 필요한 추가 처리는 32 비트 정수를 낭비하는 비용보다 큽니다.

BigInteger이 파생 클래스 PositiveBigIntegerNegativeBigInteger 인 추상 클래스가 될 가능성이 있습니다. 모든 클래스 객체는 어떤 클래스인지를 나타내는 단어를 가지므로 이러한 접근 방식은 생성 된 각 BigInteger에 대해 32 비트를 절약합니다. 이러한 방식으로 추상 클래스를 사용하면 각 함수 호출에 추가 가상 멤버 디스패치가 추가되지만 대부분의 경우 "if"테스트를 저장할 가능성이 있습니다 (예 : NegativeBigInteger의 메소드는 this이 부정적이라면 테스트 할 필요가 없습니다). 이러한 설계는 TinyBigInteger (값이 IntegerBigInteger) 및 SmallBigInteger (BigInteger의 값이 Long에 들어갈 수있는 경우)의 클래스가 있으면 효율성을 향상시킬 수도 있습니다. 나는 마이크로 소프트가 그러한 디자인을 고려했는지, 또는 그 트레이드 오프가 무엇 이었을지 전혀 모른다.

0

현재 System.Numerics.BigInteger 개체의 부호 (음수, 양수 또는 0)를 나타내는 숫자를 가져옵니다.

-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는 지원하지 않기 때문에 바이트 또는 다른 UINT, sbyte, USHORT, 짧은을 사용하지 않는 자신의 컨텍스트는 그것이 문맥없이, 무엇

관련 문제