고/저를 설정하여 C#에서 두 uint를 ulong으로 결합하는 가장 좋은 방법은 무엇입니까?두 uint를 C에서 ulong으로 결합하는 가장 좋은 방법은 무엇입니까?
bitshifting이 그것을 할 수 있음을 알고 있지만, 구문을 모르거나 BitConverter와 같은 다른 API가 도움이 될 수도 있지만 원하는 방식으로 볼 수는 없습니다. 각각
고/저를 설정하여 C#에서 두 uint를 ulong으로 결합하는 가장 좋은 방법은 무엇입니까?두 uint를 C에서 ulong으로 결합하는 가장 좋은 방법은 무엇입니까?
bitshifting이 그것을 할 수 있음을 알고 있지만, 구문을 모르거나 BitConverter와 같은 다른 API가 도움이 될 수도 있지만 원하는 방식으로 볼 수는 없습니다. 각각
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
ulong output = (ulong)highUInt << 32 + lowUInt
왼쪽 (이상) 및 (아래쪽) 오른쪽의 <<
및 >>
연산자 bitshift. highUInt << 32
은 기능적으로는 highUInt * Math.Pow(2, 32)
과 같지만 더 빠르며 (IMO) 더 간단한 구문입니다.
잘못되었습니다. 'highInt'가'uint' 인 경우'highInt << 32 == highInt'입니다. –
감사합니다. 캐스트를 추가했습니다. –
당신이 bitshift 전에 당신은 ULONG에 highInt을 변환 할 수 있습니다
ulong output = highInt;
output = output << 32;
output += lowInt;
인코딩 :
ulong mixed = (ulong)hi << 32 | lo;
디코딩 :
uint lo = (uint)(mixed & uint.MaxValue);
uint hi = (uint)(mixed >> 32);
호기심에서 벗어나 왜 캐스트가 필요합니까? – LiraNuna
만약 high가 단지 int이면, 높은 << 32는 모두 0으로 될 것입니다. 그것을 이동하기 전에 64 비트 정수 *가 필요합니다. –
Aric : "모든 변수를 변수에서 완전히 옮겼습니다."이것은 완전히 사실이 아닙니다. 업데이트 된 답변을 읽어보십시오. –