C#의 두 개의 uints를 ulong으로 결합하는 가장 좋은 방법은 무엇입니까?
문제
C#의 두 개의 uint를 ulong으로 결합하여 높은/낮은 uints를 설정하는 가장 좋은 방법은 무엇입니까?
Bitshifting이 그렇게 할 수 있다는 것을 알고 있지만 구문이나 BitConverter와 같은 다른 API를 알지 못하지만 원하는 작업을 수행하는 메소드가 보이지 않습니다.
해결책
ulong mixed = (ulong)high << 32 | low;
캐스트는 매우 중요합니다. 캐스트를 생략하면 사실을 고려할 때 high
유형입니다 uint
(32 비트), 왼쪽으로 32 비트 값을 32 비트 값으로 이동하게됩니다. 32 비트 변수의 변속 연산자는 다음을 사용합니다. right-hand-side
모드 32. 효과적으로, 이동 a uint
왼쪽에 32 비트 NO-OP입니다. 캐스팅 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
그만큼 <<
그리고 >>
연산자는 각각 왼쪽 (하이) 및 오른쪽 (하단)으로 비트로 비트로 변합니다. highUInt << 32
기능적으로 동일합니다 highUInt * Math.Pow(2, 32)
, 그러나 더 빠르고 (IMO) 더 간단한 구문입니다.
비트 시프트하기 전에 HighInt를 Ulong으로 변환해야합니다.
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);
제휴하지 않습니다 StackOverflow