2011-01-02 7 views
1

값을 계산하고 UInt32를 반환하는 빠른 비트 수준 루틴을 가지고 있습니다. 이 값을 32 비트 int 필드에 SQL Server에 저장해야합니다. 필드의 크기를 늘리고 싶지 않고이 함수의 "바이트"를 int 필드에 저장하려고합니다.C에서 가장 빠른 UInt32 변환 #

한 번에 수백 개의 레코드가 요청되므로 UInt32를 루프에서 int로 변환하는 가장 빠른 방법이 필요합니다. 맨 왼쪽 비트가 UInt32에 설정되어 있으면 int의 부호 비트를 설정해야합니다 (또는 실제로 "반복 가능"한 모든 작업을 수행하지만 실제로는 부호 비트가 가장 쉽습니다).

즉, UInt32의 4 바이트가 32 비트 int의 4 바이트가되도록합니다. BitConverter 클래스를 사용할 수는 있지만 가장 빠른 방법은 아닌 것 같습니다.

UInt32 fld = 4292515959; 
unchecked { 
    return (int)fld; 
    // -2451337 
} 

내가 반대 질문은 여기 요구 된보고, 대답은 다른 방법으로가는 같은 것이 있다면 그냥 궁금 :

은이 같은 검사되지 않은 영역이 작업을 수행하기 위해 빠른 것

Fastest way to cast int to UInt32 bitwise?

+0

동일합니다. C#을 안전 점검과 함께 C로 생각할 수 있습니다. 따라서 unsigned int를 int로 타입 변환하려면 type casting을 사용하십시오. 그러나 컴파일러가 의도를 확인하지 않도록 컴파일러에 신호를 보냅니다. 그렇게하지 않으면 컴파일러가 할당이 호환되지 않는 오류를 일으킬 수 있습니다. 호환성이 없다면 값의 충실도가 손실 될 수 있습니다 (예 : 4292515959는 더 이상 같지 않고 음수가됩니다. 2451337 (컴퓨터 과학자 [xkcd 541]의 관점에서 같음)) –

+0

Michael 감사합니다. 당신이 이것을 논평하지 않았다면, 나는 즉시 이것을 대답으로 썼을 것입니다. – Flipster

답변

3

확인되지 않은 버전 (예 : unchecked((int)x))은 메소드 호출이 없기 때문에 가장 빠른 방법입니다. 더 빠른 방법이 있다고 나는 믿지 않는다.

한편, UInt32은 다른 이름으로 uint입니다 ... 편도가는 것은 성능면에서 다른 방법과 동일하므로 게시 한 링크와 동일합니다.


편집 : 내가 먼저 손을 관찰 기억 checked빠른unchecked보다이었다 벤치 마크의 인스턴스 (그리고 아니, 디버그 빌드가 아니었다, 그것은 릴리스가 최적화를 구축했다). 왜 그런 일이 일어 났는지는 모르지만 어쨌든 오버 플로우 검사를 돌려서 측정 할 수있는 것을 얻지는 못할 것이라고 생각하지 마십시오.

+0

감사합니다 램버트. 내가 필요로하는 것만으로 안심. – Flipster

관련 문제