2009-07-30 9 views

Odpowiedz

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

Obsada jest bardzo ważna. Jeśli pominiesz rzutowanie, biorąc pod uwagę, że high jest typu uint (czyli 32 bity), przesuniesz 32-bitową wartość o 32 bity w lewo. Operatory przesuwania w zmiennych 32-bitowych będą używały elementów przesunięcia przez right-hand-side mod 32. Skutecznie, przesunięcie 32 bitów w lewo jest bez oporu. Przesyłanie do ulong zapobiega temu.

Sprawdzenie tego faktu jest proste:

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

Po prostu z ciekawości, dlaczego obsada jest potrzebna? – LiraNuna

+0

Jeśli high jest po prostu int, to high << 32 będzie zerami, ponieważ po prostu przesunąłeś wszystkie całkowicie ze zmiennej. Musisz mieć 64-bitową liczbę całkowitą * przed * rozpoczęciem przesuwania. –

+0

Aric: "właśnie przesunąłeś wszystkie całkowicie ze zmiennej" to nie jest do końca prawdą. Przeczytaj moją zaktualizowaną odpowiedź. –

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

<< i >> operatorzy Bitshift w lewo (wyższy) i prawej (dolnej), odpowiednio. highUInt << 32 jest funkcjonalnie taki sam jak highUInt * Math.Pow(2, 32), ale może być szybszy i ma prostszą składnię (IMO).

+0

To jest złe. 'highInt << 32 == highInt' jeśli' highInt' to 'uint'. –

+0

Dzięki, dodaliśmy obsadę. –

1

Trzeba przekonwertować highInt do ulong przed Bitshift:

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

Kodowanie:

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

Dekodowanie:

uint lo = (uint)(mixed & uint.MaxValue); 
uint hi = (uint)(mixed >> 32); 
Powiązane problemy