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

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

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

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

Сообщение zub » 28.06.2012 14:39:51

Код: Выделить всё
  for (i = 1, j = 0; i >= 0; i--, j += 15)
    {
      word[i] = ((unsigned int) ((value & mask) >> j)) | 0x8000;
      mask = mask << 15;
    }

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

Еще иногда в циклах на приращении счетчика стоит i++, а иногда ++i. Насколько я понимаю это без разницы. Ошибаюсь?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение serg_iv » 28.06.2012 16:27:12

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

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

и 15 в двоичке это - 1111. может поможет понять логику
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

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

Сообщение zub » 28.06.2012 16:47:30

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

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

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

Это я в курсе, но думал на цикл это не распростроняется.
соответственно получается:
Код: Выделить всё
       for i:=1 downto 0 do
         begin
             .....
             .....
             j:=j+15;
         end;
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Timid » 29.06.2012 08:57:39

Чтобы правильно перевести код нужно знать определения переменных и массива.
Судя по коду, 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; //
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

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

Сообщение bormant » 29.06.2012 14:50:21

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;
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

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

Сообщение zub » 29.06.2012 15:02:55

>>Думали правильно, внутри цикла i будет увеличенным на 1 вне зависимости от префиксности/постфикности инкремента.
В смысле увеличится на 1 после первого прохода цикла вне зависимости от преф\пост инткремента. А в данном случае уменьшится. Не надо меня еще больше путать))
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение bormant » 29.06.2012 17:54:16

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

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


Вернуться в Разное

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36

Рейтинг@Mail.ru