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.

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top