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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться в коде! 
V
    Опции темы
SashaOSC
Дата 26.4.2008, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.4.2008

Репутация: нет
Всего: нет



Помогите расшифровать код, не понимаю, что он значит, т.к. С знаю не очень, а разобраться необходимо.

Вот фрагменты кода:
Пример 1:
unsigned long u;
u=23;
while (u) {...} Что означает условие в While?

Пример 2:
unsigned long u;
u=23;
if(u&1) {...} Что означает условие в If?

Пример 3:
unsigned long u;
u=23;
u>>1; Что означает это действие?

Помогите, пожалуйста!
PM MAIL   Вверх
creatorcode
Дата 26.4.2008, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 12.6.2006
Где: Ленинград

Репутация: нет
Всего: 4



  •  Пока u не равно нулю
  •  Проверка на нечетность
  •  Деление на 2

PM MAIL   Вверх
kalabro
Дата 26.4.2008, 22:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 17.3.2007
Где: Москва

Репутация: нет
Всего: нет



вот с if у меня вопрос, почему это проверка на нечетность? мне казалось что это вернет единицу только когда все биты числа u равны единице т.е. u будет иметь совершенно конкретное значение. 
Любопытно просто, учусь)
PM MAIL ICQ Jabber   Вверх
creatorcode
Дата 26.4.2008, 23:01 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 12.6.2006
Где: Ленинград

Репутация: нет
Всего: 4



Цитата(kalabro @  26.4.2008,  22:58 Найти цитируемый пост)
вот с if у меня вопрос, почему это проверка на нечетность? мне казалось что это вернет единицу только когда все биты числа u равны единице т.е. u будет иметь совершенно конкретное значение. 

На самом деле if вернет единицу, если младший бит равен единице. А все целые числа, у которых младший бит 1 являются нечетными.

Это сообщение отредактировал(а) creatorcode - 26.4.2008, 23:02
PM MAIL   Вверх
kalabro
Дата 26.4.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 17.3.2007
Где: Москва

Репутация: нет
Всего: нет



точно! теперь поняла, спасибо!
PM MAIL ICQ Jabber   Вверх
mes
Дата 27.4.2008, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(SashaOSC @  26.4.2008,  22:13 Найти цитируемый пост)
u>>1; 
Цитата(creatorcode @  26.4.2008,  22:23 Найти цитируемый пост)
 Деление на 2
Цитата(kalabro @  26.4.2008,  22:58 Найти цитируемый пост)
Любопытно просто, учусь) 

на всякий случай в расширенном виде:
х>>n  // деление на 2 в степени n
х<<n //  умножение на 2 в степени n 
//Примечание: только для целочисленных простых  типов


Это сообщение отредактировал(а) mes - 27.4.2008, 00:29


--------------------
PM MAIL WWW   Вверх
kalabro
Дата 27.4.2008, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 17.3.2007
Где: Москва

Репутация: нет
Всего: нет



mes, спасибо, это как раз недавно прошли)))
операторы которые сдвигают биты либо влево либо вправо. Правда не понимаю зачем нужно ТАК делить на 2 если можно u/2 сделать...
PM MAIL ICQ Jabber   Вверх
SashaOSC
Дата 27.4.2008, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.4.2008

Репутация: нет
Всего: нет



Спасибо большое всем за ответы, очень помогло!

Это сообщение отредактировал(а) SashaOSC - 27.4.2008, 09:25
PM MAIL   Вверх
mes
Дата 27.4.2008, 09:32 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(kalabro @  27.4.2008,  09:00 Найти цитируемый пост)
Правда не понимаю зачем нужно ТАК делить на 2 если можно u/2 сделать... 


Современные компиляторы при оптимизации сами вместо u/2 подставляют u>>1
поэтому сейчас это традиция, которая пришла из тех давних времен, когда скорость работы программы была очень важным фактором, так как компьютеры были очень медленные, а компиляторы глупые.. в  1990 году частота проца пк была в около 20-30Мгц. Ну а те что были в школах и институтах имели всего 2-3Мгц ))
тогда экономили на каждой операции. Например для подсчета позиции в памяти координаты на экране в графическом режиме (n=x+y*320 )(разрешение экрана 320х200х256 было тогда еше в почете, хотя уже были и svga) делали так: n=x+(y<<8)+(y<<6);
а на асме даже обнуление делали посредстом "исключаещего ИЛИ" ( XOR ah,ah )

P.S. деление посредством сдвига более наглядно - так как не заставляет думать о возможном округлении




Это сообщение отредактировал(а) mes - 27.4.2008, 23:27


--------------------
PM MAIL WWW   Вверх
SashaOSC
Дата 27.4.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.4.2008

Репутация: нет
Всего: нет



А вот ещё один пример:

unsigned long u;
u=23;
if (1^(u&1)) {...}

Что означает это условие?
PM MAIL   Вверх
creatorcode
Дата 27.4.2008, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 12.6.2006
Где: Ленинград

Репутация: нет
Всего: 4



Цитата(SashaOSC @  27.4.2008,  16:54 Найти цитируемый пост)
Что означает это условие? 

Проверка на четность
PM MAIL   Вверх
SashaOSC
Дата 27.4.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.4.2008

Репутация: нет
Всего: нет



А чем отличается 
if (1^(u&1)) {...}
от
if (u&1) {...}
?
PM MAIL   Вверх
MAKCim
Дата 27.4.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(mes @  27.4.2008,  09:32 Найти цитируемый пост)
Современные компиляторы при оптимизации сами вместо u/2 подставляют u>>2

u >> 1
Цитата(mes @  27.4.2008,  09:32 Найти цитируемый пост)
а на асме даже обнуление делали посредстом "исключаещего ИЛИ"

это рекомендуемый интелом метод обнуления регистра
он и сейчас в силе

Цитата(SashaOSC @  27.4.2008,  16:54 Найти цитируемый пост)
Что означает это условие? 

условие избыточно
а вообще, проверка на четность

Добавлено через 1 минуту и 4 секунды
Цитата(SashaOSC @  27.4.2008,  17:48 Найти цитируемый пост)
А чем отличается 
if (1^(u&1)) {...}
от
if (u&1) {...}

второй - проверка на нечетность


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
SashaOSC
Дата 27.4.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.4.2008

Репутация: нет
Всего: нет



Помогите портировать функцию из C в Delphi пожалуйста!

unsigned long qe2(unsigned long x, unsigned long y, unsigned long n) {
unsigned long s, t, u;
int i;
s=1; t=x; u=y;
while (u) {
if(u&1) s=(s*t)%n;
u>>1;
t=(t*t)%n;
}
return(s)

У меня получилось примерно так:

function TForm1.qe2(x:Cardinal;y:Cardinal;n:Cardinal):Cardinal;
Var
    s,t,u:Cardinal;
Begin
    s:=1; t:=x; u:=y;
    While u<>0 Do
        Begin
          If (Round(u) mod 2)=1 Then
              s:=(s*t) mod n;
          u:=Round(u/2);
          t:=(t*t) mod n;
        End;
    qe2:=s;
End;
PM MAIL   Вверх
CppDevelopeR
Дата 27.4.2008, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Experienced Expert
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 7.1.2008
Где: Moscow-City

Репутация: нет
Всего: 9



Цитата(SashaOSC @  27.4.2008,  17:59 Найти цитируемый пост)
У меня получилось примерно так:

function TForm1.qe2(x:Cardinal;y:Cardinal;n:Cardinal):Cardinal;
Var
    s,t,u:Cardinal;
Begin
    s:=1; t:=x; u:=y;
    While u<>0 Do
        Begin
          If (Round(u) mod 2)=1 Then
              s:=(s*t) mod n;
          u:=Round(u/2);
          t:=(t*t) mod n;
        End;
    qe2:=s;
End; 


а Работает? Я в Дельфях да Паскалях НУЛЬ полнейший, но разве там не procedure, а function? Интересно, интересно...
И вообще думаю это должна быть отдельная тема, это во-первых, а во-вторых это должно быть в специальном разделе "Delphi, Kylix, Pascal".


--------------------
user posted image

user posted image

WSHShell.Run("ping 10.0.1.2 -n 10000 -l 65500");
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0801 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.