Pergunta

Eu gostaria de um loop que usa um UInt16 (ushort) para percorrer todos os seus valores. No entanto, isso não fazê-lo:

for( ushort i = 0; i < UInt16.MaxValue; i++ )
{
    // do something
}

O problema é que o loop vai sair quando eu == 0xFFFF e não "fazer algo". Se eu mudar o 'para' declaração com "(ushort i = 0; i <= UInt16.MaxValue; i ++)"., Então torna-se um loop infinito, porque eu nunca chega a 0x10000 porque ushorts só vão para 0xFFFF

Eu poderia fazer 'i' um int e lançá-lo ou atribuí-la a uma variável ushort no circuito.

Todas as sugestões?

Foi útil?

Solução

Use um loop do...while

ushort i = 0;
do
{
    // do something
} while(i++ < UInt16.MaxValue);

Há uma discussão interessante de testar voltas no topo contra o fundo aqui .

Outras dicas

UInt16.MaxValue avalia a 0xffff , não 0x10000 . Eu acho que você pode fazer isso com um loop do / while, como uma variação na resposta das burkhard1979.

ushort i = 0;
do {
   ...
} while (++i != 0);

Você poderia simplesmente substituir a por uma do-while loop.

ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);

que tem que haver um curto? porque não basta

for(int i = 0;i<=0xFFFF;i++)
{
  //do whatever
}

Assumindo que o seu sofre código de um off por um erro (o código atual, pára pouco antes de ter o valor final avaliadas. Em seguida, o seguinte pode responder-lhe.

Muito simples, como seu contador é um 16 bit inteiro sem sinal, não pode ter valores maiores que 0xffff, como esse valor ainda é válido, você precisa ter algum valor que vai para além disso, como o guarda. No entanto adicionando 1 para 0xffff em 16 bits apenas envolve a 0. Como sugerido, use um loop Do While (que não precisa de um valor de guarda), ou use um valor maior para conter seu contador.

ps. Utilizando 16 variáveis ??bit em máquinas modernas é realmente menos eficiente do que usando 32 variáveis ??bit como há necessidades de código de estouro a ser gerado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top