Цикл от 0x0000 до 0xFFFF - PullRequest
       28

Цикл от 0x0000 до 0xFFFF

6 голосов
/ 23 октября 2008

Я бы хотел цикл, который использует UInt16 (ushort) для циклического перебора всех его значений. Тем не менее, это не делает это:

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

Проблема в том, что цикл завершится, когда я == 0xFFFF, а не "сделаю что-то". Если я изменю оператор for на «for (ushort i = 0; i

Я мог бы сделать 'i' целым и привести его или присвоить его переменной ushort в цикле.

Есть предложения?

Ответы [ 5 ]

17 голосов
/ 23 октября 2008

Используйте do...while петлю

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

Здесь интересно обсудить циклы тестирования сверху и снизу здесь .

5 голосов
/ 23 октября 2008

UInt16.MaxValue оценивается как 0xffff, а не 0x10000. Я думаю, что вы можете сделать это с помощью петли do / while, как вариант ответа Burkhard1979.

ushort i = 0;
do {
   ...
} while (++i != 0);
4 голосов
/ 23 октября 2008

Вы можете просто заменить for на цикл do-while.

ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);
1 голос
/ 24 октября 2008

Предполагая, что ваш код отключен на одну ошибку (текущий код останавливается непосредственно перед оценкой окончательного значения. Тогда вам может ответить следующее.

Очень просто, так как ваш счетчик представляет собой 16-битное целое число без знака, он не может иметь значения больше 0xffff, так как это значение все еще допустимо, вам нужно иметь какое-то значение, которое выходит за его пределы в качестве защиты. Однако добавление 1 к 0xffff в 16 битах просто обернется до 0. Как и предполагалось, либо используйте цикл do while (для которого не требуется защитное значение), либо используйте большее значение для хранения вашего счетчика.

пс. Использование 16-битных переменных на современных машинах фактически менее эффективно, чем использование 32-битных переменных, так как не требуется генерировать код переполнения.

1 голос
/ 24 октября 2008

это должно быть коротким? почему не просто

for(int i = 0;i<=0xFFFF;i++)
{
  //do whatever
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...