2009-07-30 4 views

답변

18
ulong mixed = (ulong)high << 32 | low; 

캐스트가 매우 중요합니다. 캐스팅을 생략하면 uint (32 비트) 유형 인 high을 고려하면 32 비트 값을 왼쪽으로 32 비트 이동합니다. 32 비트 변수의 시프트 연산자는 right-hand-side mod32로 시프트를 사용합니다. uint 32 비트를 왼쪽으로 으로 이동하면 no이됩니다. ulong으로 전송하면이 문제를 방지 할 수 있습니다. 이 사실을 확인

은 간단합니다 :

uint test = 1u; 
Console.WriteLine(test << 32); // prints 1 
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1 
+0

호기심에서 벗어나 왜 캐스트가 필요합니까? – LiraNuna

+0

만약 high가 단지 int이면, 높은 << 32는 모두 0으로 될 것입니다. 그것을 이동하기 전에 64 비트 정수 *가 필요합니다. –

+0

Aric : "모든 변수를 변수에서 완전히 옮겼습니다."이것은 완전히 사실이 아닙니다. 업데이트 된 답변을 읽어보십시오. –

2
ulong output = (ulong)highUInt << 32 + lowUInt 

왼쪽 (이상) 및 (아래쪽) 오른쪽의 <<>> 연산자 bitshift. highUInt << 32은 기능적으로는 highUInt * Math.Pow(2, 32)과 같지만 더 빠르며 (IMO) 더 간단한 구문입니다.

+0

잘못되었습니다. 'highInt'가'uint' 인 경우'highInt << 32 == highInt'입니다. –

+0

감사합니다. 캐스트를 추가했습니다. –

1

당신이 bitshift 전에 당신은 ULONG에 highInt을 변환 할 수 있습니다

ulong output = highInt; 
output = output << 32; 
output += lowInt; 
1

인코딩 :

ulong mixed = (ulong)hi << 32 | lo; 

디코딩 :

uint lo = (uint)(mixed & uint.MaxValue); 
uint hi = (uint)(mixed >> 32); 
관련 문제