Привести число к виду 1 + 2^k * q

Тема в разделе "WASM.A&O", создана пользователем volodya, 17 авг 2004.

  1. DaemoniacaL

    DaemoniacaL New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    42
    Адрес:
    Russia
    volodya

    неее :))



    вариант первый:

    @@

    shr eax, 1

    jp @b



    вариант второй:

    bsf ecx, eax

    shr eax, cl



    и больше никаких переходов :))
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    вообще-то условию задачи удовлетворяет и такое решение :)
    Код (Text):
    1.  
    2. void do_n(unsigned n, unsigned *k, unsigned *q)
    3. {
    4.     __asm
    5.     {
    6.         mov eax, n
    7.         mov edx, k
    8.         shr eax, 1
    9.         mov [edx], 1
    10.         mov edx, q
    11.         mov [edx], eax
    12.     }
    13. }
    14.  
     
  3. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Твое решение создает лишь access violation. Больше от него толку я не вижу.
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    volodya

    у меня работает...

    не могли бы вы привести пример, вызывающий AV ?
     
  5. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Меня, пожалуйста, на "ты".

    Будь добер :), приведи мне полную программу с твоей процедурой для числа 105.
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Код (Text):
    1.  
    2. #include <stdio.h>
    3.  
    4. void do_n(unsigned n, unsigned *k, unsigned *q)
    5. {
    6.     __asm
    7.     {
    8.         mov eax, n
    9.         mov edx, k
    10.         shr eax, 1
    11.         mov dword ptr [edx], 1
    12.         mov edx, q
    13.         mov [edx], eax
    14.     }
    15. }
    16.  
    17.  
    18. int main(int argc, char* argv[])
    19. {
    20.     unsigned n = 105, k, q;
    21.     do_n(n, &k, &q);
    22.     printf("k = %d; q = %d", k, q);
    23.     return 0;
    24. }
    25.  
     
  7. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Спасибо. А теперь, разреши спросить, ТЫ ВНИМАТЕЛЬНО ЧИТАЛ УСЛОВИЯ ЗАДАЧИ? Я ведь говорил - q должно быть НЕЧЕТНЫМ!
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    мда...

    ну извини тогда.
     
  9. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Да чего извиняться? Думаешь я прямо так уж сильно в этом разбираюсь? Вовсе нет. Все мы тут учимся.
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    DaemoniacaL >




    Дык чётность по флагу P - это чётное количество единиц в двоичном представлении числа!







    volodya



    Вариант
    Код (Text):
    1.     mov  eax, n
    2.     dec  eax
    3.  
    4.     bsf  ecx, eax
    5.     shr  eax, cl
    6.  
    7.     mov  q, eax
    8.     mov  k, ecx
    Это полное решение - никаких циклов тут не нужно, но для некоторых чисал (например вида 2<sup>n</sup>-1) первый вариант (с циклом) будет быстрее.
     
  11. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Я уже давно это понял :) Спасибо :)