Qual é a melhor forma de combinar dois uints em um ulong em c#
Pergunta
Qual é a melhor forma de combinar dois uints em um ulong em c#, a configuração de alta/baixa uints.
Eu sei bitshifting pode fazer isso, mas eu não sei a sintaxe, ou talvez existam outras APIs para ajudar como BitConverter, mas eu não vejo um método que faz o que eu quero.
Solução
ulong mixed = (ulong)high << 32 | low;
O elenco é muito importante.Se você omitir o elenco, considerando o fato de que high
é do tipo uint
(que é de 32 bits), você vai estar mudando um valor de 32 bits 32 bits para a esquerda.Shift operadores de 32 bits variáveis use shift coisas por right-hand-side
mod 32.Efetivamente, mudando um uint
De 32 bits para a esquerda é um não-op.Carcaça para ulong
impede isso.
Verificando este fato é fácil:
uint test = 1u;
Console.WriteLine(test << 32); // prints 1
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1
Outras dicas
ulong output = (ulong)highUInt << 32 + lowUInt
o <<
e >>
Os operadores deslocam para a esquerda (mais alta) e direita (inferior), respectivamente. highUInt << 32
é funcionalmente o mesmo que highUInt * Math.Pow(2, 32)
, mas pode ser mais rápido e é uma sintaxe mais simples (IMO).
Você tem que converter o Highint em um Ulong antes de seu desvio de bits:
ulong output = highInt;
output = output << 32;
output += lowInt;
Codificação:
ulong mixed = (ulong)hi << 32 | lo;
Decodificação:
uint lo = (uint)(mixed & uint.MaxValue);
uint hi = (uint)(mixed >> 32);