Мелкие задачки для крупных мозгов №20

Тема в разделе "WASM.A&O", создана пользователем The Svin, 5 май 2006.

  1. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    даны числа a,b принадлежат к знаковым INT32 bit.

    число a должно вернуть число принадлежащее {a,b} которое по модулю больше.

    Обращаю внимание - не абсолютное значение, а реальное.

    Примеры:

    1.

    a = -12 , b = -1

    a <- (-12)

    2.

    a = -7, b = 8

    a <- (8)

    3.

    a = 0, b = -16

    a <- (-16)

    4.

    a = 16, b = -16

    a <- (16) или a <- (-16) (любой из вариантов)



    Безбранчевый код. Оптимизация по размеру или количеству базовых инструкций.
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    eax = a

    ebx = b



    9 инструкций 17 байт (использует ecx,edx):
    Код (Text):
    1.     mov edx,eax
    2.     add edx,ebx
    3.     cmc
    4.     sbb edx,edx
    5.     sub eax,ebx
    6.     sbb ecx,ecx
    7.     xor edx,ecx
    8.     and eax,edx
    9.     add eax,ebx




    8 инструкций 16 байт (то же + инвертирует ebx):
    Код (Text):
    1.     neg ebx
    2.     cmp ebx,eax
    3.     sbb edx,edx
    4.     add eax,ebx
    5.     sbb ecx,ecx
    6.     xor edx,ecx
    7.     and eax,edx
    8.     sub eax,ebx
     
  3. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Замечательные задачки, в упор не понимаю как решаются. Сдаеться мне что специалисты по решению задач типа из "Истории Одного Байта", будут цениться на вес золота в отдаленном будущем (если конечно золото не обесцениться).
     
  4. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    alpet



    А ты автора решений попроси вежливо, он объяснит, он очень добрый, но стеснительный - думает, что и так все всё понимают, зачем лишние комментарии писать? :)
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    alpet







    Ага, конечно, это когда сегодня гигабайты стоят копейки, в отдаленном будущем каждый байт будет на счету :)))
     
  6. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    _DEN_

    Ты в курсе сколько памяти в PIC контроллере?
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    The Svin



    Нет. Я знаю что в моем телефоне ОЗУ столько же сколько в первой SonyPlayStation. Подобные тенденции наблюдаются во всех девайсах.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    The Svin



    Хотя с другой стороны мой телефон стоит больше чем X-BOX-360 :)))
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Так вот чем он со мной померяться хотел! _DEN_, а у меня вообще телефона нет.
     
  10. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Ну вобщем мы поняли друг друга. Тут видишь ли различные реалии нас окружают. Я типичный низкоуровневик. Человек которого приглашают когда работа не стандартная. Нужно сделать по интерфейсу и кодам досель неведомое, либо нужно сделать по ресурсам в два раза дешевле, чтобы полмиллиона дивайсов стали всего то на полтинник дешевле. Что с'экономить 25 миллионов промеж делом :)
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Quantum



    Ну когда то и я был бедным студентом и завидовал тем у кого была nokia-3110 :derisive:
     
  12. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia


    Слушай, и у меня нет :\ Я думал я один такой :))



    ЗЫ. Что то мы топик засорили ;)

    Чёрное Зеркало наверное вздрагивает каждый раз видя что появился новый пост - думает кто-то его код побил.

    А это мы просто лясы точим :))
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    The Svin



    И сколько из этих 25-ти миллионов получишь лично ты? ;)
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    The Svin







    Да ладно гнать - живет небось на собственном острове, катается на ferrari-f50 :))
     
  15. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    _DEN_

    З\П у меня очень скромная даже по Российским меркам. Но работа интересная. Правда, сложноватая.
     
  16. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Антивирус в биос зашить, сэкономить одну болванку в дистрибутиве популярной игрухи, ..., червячка неприметного сделать, эксплоит в стек утрамбовать, ... Всё это и по сей день актуально. За это деньги платят. А во встроенных девайсах (embedded т.е.) вообще море примеров можно найти.



    В одном популярном микроконтроллере ровно 1Кб памяти, которая разделяется кодом, данными, стеком/хипом, векторами прерываний... Если проге этого килобайта не хватает, можно подключить флеш, который стоит в 2 раза больше, чем сам микроконтроллер. В промышленных масштабах это означает бешенные деньги.



    2 _DEN_:

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



    2 The Svin:

    Точно. Может Айс придёт почистит эту грязь. Сорри за флуд.
     
  17. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Так как описать словами это очень тяжело, то я поясню только второй вариант.



    Если взять три беззнаковых числа A,B и C, то чтобы проверить, попадает ли B в интервал [A,C) или (A,C] нужно произвести два сравнения B<A и B<C. Если выполняется только одно из этих условий, то B попадает в интервал [А,С) при A<C, или в интервал [C,A) при С<A.



    Проверку условия |B|<|A| можно заменить проверкой того, что B или -B попадают в интервал (-A,A) если A>0, или в интервал (A,-A) если A<0. Если же рассматривать числа B,A и -А как беззнаковые, то нужно проверить что B не попадает в интервал (A,-A) или в интервал (-A,A).



    В данном коде по результатам двух стравнений формируются маски в регистрах ECX и EDX. После чего над ними выполняется операция XOR. Ну а в последней операции получается B если B попадает в интервал [min(A,-A),max(A,-A)), то есть больше по модулю, или A в противном случае. Хоть левая граница и входит в интервал, но в условиях задачи при равенству модулей можно вернуть любое число.


    Код (Text):
    1.     neg ebx     ;-b
    2.     cmp ebx,eax ;(-b)-a
    3.     sbb edx,edx ;(-b)<a
    4.     add eax,ebx ;(-b)-(-a)
    5.     sbb ecx,ecx ;(-b)<(-a)
    6.     xor edx,ecx ;
    7.     and eax,edx ;(-b)-(-a) или 0
    8.     sub eax,ebx ;(-b)-(-a)-(-b) или -(-b)