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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка на чётность, MS VC ++ 6.0 
:(
    Опции темы
bel_nikita
Дата 21.7.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата(GremlinProg @ 21.7.2006,  18:20)
модуль(%) - есть ни что иное, как арифметическое умножение на логарифм правой части выражения по основанию 2, так что операции (% 2) и (& 1) равнозначны

Операции то равнозначные, но реализации различны. И поэтому "&" - выигрывает у "%" в проверке на четность.

З.Ы: Для тех кто в танке: посмотрите на реализацию % и & через дизассемблер... 


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 21.7.2006, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Код

    int a    = 100;
    if(!(a%2)){
        ::MessageBox(0,0,0,0);
    }


0042602E  mov         dword ptr [a],64h 
00426035  mov         eax,dword ptr [a] 
00426038  and         eax,80000001h 
0042603D  jns         WinMain+34h (426044h) 

Код

    int a    = 100;
    if(!(a&1)){
        ::MessageBox(0,0,0,0);
    }


0042602E  mov         dword ptr [a],64h 
00426035  mov         eax,dword ptr [a] 
00426038  and         eax,1 
0042603B  jne         WinMain+44h (426054h) 


Думаю пояснять ни чего не надо?!

Добавлено @ 20:03 
единственное, в чем преимущество (%), так в том, что проблем с unsigned у вас никогда не будет, поэтому (%) корректнее чем (&) 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Pete
Дата 21.7.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bel_nikita @  23.12.2004,  00:28 Найти цитируемый пост)
Код

return !(value & 1);

Это медленнее, чем 
Код

return (value ^ 0);

 smile 

Цитата(ptr @  21.7.2006,  13:22 Найти цитируемый пост)
Зато с (value%2==0) понятнее что делается...

Все зависит от степени привыкания  smile  


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
bel_nikita
Дата 21.7.2006, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата
единственное, в чем преимущество (%), так в том, что проблем с unsigned у вас никогда не будет, поэтому (%) корректнее чем (&)

Неа, в твоем примере мы видим оптимизацию компилятора, а никак не реализацию smile 


З.Ы.: для танкистов:
Код

196:    int value = 100;
00401028   mov         dword ptr [ebp-4],64h
197:
198:    if ( value % 2 )
0040102F   mov         eax,dword ptr [ebp-4]
00401032   and         eax,80000001h
00401037   jns         main+2Eh (0040103e)
00401039   dec         eax
0040103A   or          eax,0FFFFFFFEh
0040103D   inc         eax
0040103E   test        eax,eax
00401040   je          main+3Fh (0040104f)
199:    {
200:      printf("odd");
00401042   push        offset string "odd" (0042c01c)
00401047   call        printf (004010a0)
0040104C   add         esp,4
201:    }
202:
203:    if ( value & 1 )
0040104F   mov         ecx,dword ptr [ebp-4]
00401052   and         ecx,1
00401055   test        ecx,ecx
00401057   je          main+56h (00401066)
204:    {
205:      printf("odd");
00401059   push        offset string "odd" (0042c01c)
0040105E   call        printf (004010a0)
00401063   add         esp,4
206:    }

 


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 22.7.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Слушай, танкист! не морочь людям мозги. Посмотри на свой же код! 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
bsa
Дата 22.7.2006, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GremlinProg @ 22.7.2006,  17:50)
Слушай, танкист! не морочь людям мозги. Посмотри на свой же код!

Код
198:    if ( value % 2 )
0040102F   mov         eax,dword ptr [ebp-4]
00401032   and         eax,80000001h
00401037   jns         main+2Eh (0040103e)
00401039   dec         eax
0040103A   or          eax,0FFFFFFFEh
0040103D   inc         eax
0040103E   test        eax,eax
00401040   je          main+3Fh (0040104f)

против:
Код
203:    if ( value & 1 )
0040104F   mov         ecx,dword ptr [ebp-4]
00401052   and         ecx,1
00401055   test        ecx,ecx
00401057   je          main+56h (00401066)

Что называется - почувствуйте разницу. 
PM   Вверх
bel_nikita
Дата 22.7.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата(GremlinProg @ 22.7.2006,  16:50)
не морочь людям мозги. Посмотри на свой же код!

ну и ты хоть взгляни, может найдешь отличия smile  


З.Ы.: для тех, кто еще остается в танке - вместо int подставть unsigned ...
 


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 24.7.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Если танкист пишет только в дебаге, то мне пора на пенсию )
Вот релиз, проверка HINSTANCE на четность:

Код

    unsigned a    = (unsigned)(INT_PTR)hInstance;
    if(a%2){
        ::MessageBox(0,0,0,0);
    }
    if(a&1){
        ::MessageBox(0,0,0,0);
    }


00403169  mov         edi,dword ptr [esp+10h] 
0040316D  mov         esi,edi 
0040316F  and         esi,1 
00403172  je          WinMain+1Eh (40317Eh) 
        ::MessageBox(0,0,0,0);
00403174  push        0    
00403176  push        0    
00403178  push        0    
0040317A  push        0    
0040317C  call        ebx  
    }
    if(a&1){
0040317E  test        esi,esi 
00403180  je          WinMain+2Ch (40318Ch) 
        ::MessageBox(0,0,0,0);
00403182  push        0    
00403184  push        0    
00403186  push        0    
00403188  push        0    
0040318A  call        ebx  
    }

Добавлено @ 11:27 
Глупо спорить на тему скорости с оптимизацией VS от самой Microsoft ) 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
sergejzr
Дата 24.7.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



GremlinProg, а кроме VS других компилеров не существует? % есть остаток от деления и если бы компилер делал то, что ему говорят (А многие так и делают), то провёл бы деление и взял остаток. Ваш промер есть оптимизация кода конкретного компилера и для общего случая он (как пример) не годится.

Точно так же х/2 компилеры оптимизуют в х>>1. Но говорить, что в общем случае деление по скорости совпадает со сдвигом на 1 - бесмыссленно.  


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
GremlinProg
Дата 24.7.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Проверь на другом компиляторе, чтобы удостовериться в своей правоте.
Цитата
провёл бы деление и взял остаток

Деление целочисленных есть ни что иное, как сдвиг вправо, а остаток от деления - правая часть результата этого сдвига. Зачем делить, если можно просто взять этот остаток Эндом? Оптимизация в любом компиляторе это должна учитывать, иначе на что она нужна, такая оптимизация?
А по поводу 
Цитата
Точно так же х/2 компилеры оптимизуют в х>>1. Но говорить, что в общем случае деление по скорости совпадает со сдвигом на 1 - бесмыссленно.

заблуждаешься: код высокого уровня для того и нужен, чтобы абстрагировать задачу от конкретной её реализации на конкретном компиляторе, поэтому, если необходимо вычислить остаток, то и нужно писать (%), а не (&), а компилятор сам знает, что он должен сделать быстрее, а что - медленнее. Может быть это и прописные истины, но почему-то многие о них забывают.  


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
sergejzr
Дата 24.7.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(GremlinProg @  24.7.2006,  10:13 Найти цитируемый пост)
заблуждаешься: код высокого уровня для того и нужен, чтобы абстрагировать задачу от конкретной её реализации на конкретном компиляторе, поэтому, если необходимо вычислить остаток, то и нужно писать (%), а не (&), а компилятор сам знает, что он должен сделать быстрее, а что - медленнее. 


Уровень кода тут не причём. Тем более С (о котором мы сейчас в общем-то и говорим). Например освобождение памяти прямо таки опускает на землю абстрактность любой задачи.
Вообще С тем и примечателен, что даёт делать то, что угодно (в отличии он Явы например). И если я хочу, чтобы он делил, он должен делить. 
И компилеров существует масса и никто не может со 100% увереностью сказать во что превратиться его код, если он не будет вручную навязывать это компилятору сам.

Другое дело, что оптимизатор на многих компилерах по умолчанию включен. Это с идеалогической точки зрения как раз ошибочный подход. 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
dumb
Дата 24.7.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Цитата(GremlinProg @  24.7.2006,  12:13 Найти цитируемый пост)
Деление целочисленных есть ни что иное, как сдвиг вправо, а остаток от деления - правая часть результата этого сдвига.

где-то в этой фразе должно быть словосочетание "степень двойки"... smile

ps. так и не смог уловить предмет спора. такое впечатление что "каждый о своем"... smile 
PM MAIL   Вверх
GremlinProg
Дата 24.7.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



dumb, похоже прав: я тут говорю о "бессмертном" коде, т.е. код живет и развивается до тех пор, пока его понимают, и как бы вы не издевались над ним, как бы не ускоряли его выполнение - код умирает сразу, если хотя бы часть его становится нечитабельной. sergej.z мешает две абсолютно разные вещи: моделирование и оптимизация. Как известно, моделирование - первостепенная задача - это есть сам процесс создания программы, на этом этапе закладываются основы её функционирования. А оптимизация - второстепенная задача, которая не всегда оправдывает затраты: оптимизировать можно вечность, а результат будет скрыт от глаз пользователя за толщей интерфейсов операционной системы, и даже не важно какой. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
sergejzr
Дата 24.7.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(dumb @  24.7.2006,  10:26 Найти цитируемый пост)
ps. так и не смог уловить предмет спора. такое впечатление что "каждый о своем"... smile  

Предмет в том, что GremlinProg утверждаетм что х%2 и х&1 - одинаковые операции.
Я же придерживаюсь мнения, что это может быть верно, но после оптимизации на конкретном компиляторе. 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
GremlinProg
Дата 24.7.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



не совсем так, я пытался объяснить, почему нельзя использовать такие оптимизации в коде. И показал пример, который визуально указывает на разные действия, в данном случае модуль и умножение, а практически делает одно и то же. Объяснил, почему для разработчика так важно знать, что действительно происходит в коде, т.е. что он имел ввиду, когда писал код. Если над проектом работает один программист, то, конечно, можно положиться на его память и надеяться на то, что через пару недель, месяцев, лет он таки вспомнит свои действия. Но, если над проектом работает несколько программистов, то бишь группа, тогда с такими подходами, как у sergej.z, сработаться им будет крайне сложно.

Моя позиция такая: если хочешь оптимизировать - используй оптимизацию компилятора. Если оптимизация не устраивает - меняй компилятор и учи язык. Почти все компиляторы, которые только существуют имеют возможность работать в нескольких режимах оптимизации. Суть даже не в том, нужна оптимтзация или нет, оптимизация присутствует всегда, разница лишь в её детальности. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM 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.0956 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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