Микроупражнение: числа со сброшенным битом

Тема в разделе "WASM.A&O", создана пользователем captain cobalt, 28 ноя 2005.

  1. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    Рассмотрим последовательности целых чисел, у которых сброшен некоторый бит.



    Последовательность чисел со сброшенным нулевым (младшим) битом:

    0, 2, 4, 6, 8, ...



    Последовательность чисел со сброшенным первым битом:

    0, 1, 4, 5, 8, 9, ...



    Нужно написать безбранчевую последовательность команд для получения следующего числа последовательности.



    Для нулевого бита это очень просто, всего одна команда: ADD EAX,2



    Нужно написать код для других битов. ;)
     
  2. _DEN_

    _DEN_ DEN

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







    Неправильно ;) Для нулевого бита это shl eax,1



    Для остальных (случай eax < 32768), первое что придумалось -



    ror eax,n

    shl ax,1

    rol eax,n
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Очевидно, что сколько не сдвигай 0, значение его не изменится =)
     
  4. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    Следует отметить отличие между:



    1. По заданному числу последовательности вычислить следующее число

    2. По заданной позиции в последовательности вычислить число на этой позиции



    ADD EAX,2 - это первый пункт, сдвиги - это второй пункт.



    Задача ставится как первый пункт. ;)
     
  5. _DEN_

    _DEN_ DEN

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







    Все просто :) По заданному числу узнаем его позицию,



    ror eax,n

    shr eax,1

    rol eax,n



    inc eax



    ror eax,n

    shl eax,1

    rol eax,n



    и задача сводится к пункту номер два :)))
     
  6. _G3

    _G3 New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    41
    Адрес:
    Russia
    Вроде так. Насчет правильности синтаксиса не уверен.

    add eax,2*n+1

    and eax,not (1 shl n)

    [добавлено]

    опс. так по ходу правильно.

    add eax,(1 shl n)+1

    and eax,not (1 shl n)
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    В обратном порядке, кажется можно так
    Код (Text):
    1.             xor     eax,eax
    2. @@:         dec     eax
    3.             and     eax,not (1 shl n)
    4.             jnz     @b