Помогите перевести цикл с басурманского на нашинский

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

Модератор: Модераторы

Ответить
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Помогите перевести цикл с басурманского на нашинский

Сообщение zub »

Код: Выделить всё

  for (i = 1, j = 0; i >= 0; i--, j += 15)
    {
      word[i] = ((unsigned int) ((value & mask) >> j)) | 0x8000;
      mask = mask << 15;
    }

Это два вложенных цикла или один с двумя счетчиками?

Еще иногда в циклах на приращении счетчика стоит i++, а иногда ++i. Насколько я понимаю это без разницы. Ошибаюсь?
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

цикл один
i - счетчик цикла
J - переменная используется для поразрядного сдвига какой то переменной

i++ постфиксный инкремент (сначала выполняется код в теле цикла, потом инкрементируется i)
++i префиксный инкремент (соответственно сначала инкрементируется i потом выполняется тело цикла)

и 15 в двоичке это - 1111. может поможет понять логику
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Код: Выделить всё

mask << 15

разве это не сдвиг на 15 разрядов? соответственно mask shl 15

i++ постфиксный инкремент
++i префиксный инкремент

Это я в курсе, но думал на цикл это не распростроняется.
соответственно получается:

Код: Выделить всё

       for i:=1 downto 0 do
         begin
             .....
             .....
             j:=j+15;
         end;
Timid
постоялец
Сообщения: 290
Зарегистрирован: 21.11.2007 20:33:15

Сообщение Timid »

Чтобы правильно перевести код нужно знать определения переменных и массива.
Судя по коду, mask и value - целые, причем тоже unsigned, т.е. без знака, так же как и элементы массива word

Поищите в коде похожие определения:

Код: Выделить всё

unsigned int mask;
unsigned int value;
unsigned int word[];

Если да, то цикл должен примерно выглядеть так:

Код: Выделить всё

i:=1;
j:=0;
while (i>=0) do begin // for с двумя индексами в pascal невозможен
  word[i]:=((value AND mask) shr j)OR(&8000); // ((unsigned int) ((value & mask) >> j)) | 0x8000    преобразование "без знака" выполнится само, если массив объявлен беззнаковым: var  word:array of word, к примеру.
  mask := mask shl 15;
  dec(i,1); // или i:=i-1;
  inc(j,15); // или j:=j+15;
end; //
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

zub писал(а): думал на цикл это не распростроняется

Думали правильно, внутри цикла i будет увеличенным на 1 вне зависимости от префиксности/постфикности инкремента.

Код: Выделить всё

j := 0; 
for i := 1 downto 0 do begin
  word[i] := ((value and mask) shr j) or $8000;
  mask := mask shl 15;
  inc(j, 15)
end;
Но обязательно нужно посмотреть на типы переменных word, value, mask с точки зрения размера и знаковости.

Или, если развернуть цикл

Код: Выделить всё

word[1] := (value and mask) or $8000;
mask := mask shl 15;
word[0] := ((value and mask) shr 15) or $8000;
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Думали правильно, внутри цикла i будет увеличенным на 1 вне зависимости от префиксности/постфикности инкремента.
В смысле увеличится на 1 после первого прохода цикла вне зависимости от преф\пост инткремента. А в данном случае уменьшится. Не надо меня еще больше путать))
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

zub писал(а):Не надо меня еще больше путать))

Не имел ничего подобного в мыслях. Но цитировал и отвечал вот на это сообщение: viewtopic.php?f=9&t=8184&view=unread#p63333 , а там уж, извините, были инкременты. Префиксность/постфикность инкрементов/декрементов важна в точке употребления выражения. А в данном случае результат выражения в точке употребления не используется.
Ответить