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

Тема в разделе "WASM.ZEN", создана пользователем The Svin, 4 мар 2005.

  1. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Задачка аналогична задачке №2 но здесь нам нужно посчитать колличество бинарных строк (определение см. в задачке 2) не в двойном слове а в огромном массиве.

    Дан указатель на массив и размер в байтах, на выходе дать количество бинарных строк.

    Замечание - не допустите детскую ошибку бинарные строки могут быть любой длины - т.е. сумма бинарных строк в двойных словах может (и чаще всего) не равна общему количеству строк в массиве.

    Наприме в двух рядом стоящих двойных словах

    00FFFFFF FF000000

    средняя (нулевая) строка занимает две старшие тетрады (сикс и септ тетры) младшего двойного слова и 6 младших

    (до квинт тетры включительно) тетрады следующего двойного слова.
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Код (Text):
    1. bscnt:;(start +4, len +8):eax - число строк
    2.     mov eax,1
    3.     mov ebx,[esp+4]
    4.     mov edx,[esp+8]
    5.     lea ecx,[edx*8]
    6.     and ecx,3*8
    7.     jnz .l9
    8.     sub edx,4
    9.     .l9:
    10.     sub ecx,32
    11.     neg ecx
    12.     and edx,-4
    13.     mov esi,[ebx+edx]
    14.     shl esi,cl
    15.     sar esi,cl
    16.     mov ebp,esi
    17.     .next:
    18.     mov ecx,esi
    19.     shl ebp,1
    20.     rcr ecx,1
    21.     sbb ebp,ebp
    22.     xor esi,ecx
    23.     .l0:
    24.     adc eax,0
    25.     .l1:
    26.     add esi,esi
    27.     ja .l1
    28.     jc .l0
    29.     sub edx,4
    30.     mov esi,[ebx+edx]
    31.     jge .next
    32.     ret 8
     
  3. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Код (Text):
    1. Вход: EDI = адрес массива, ECX = длина в байтах (лучше б была в битах). Выход: BL = число битовых строк
    2.     mov ah, 1
    3.     xor ebx, ebx
    4.     shl ecx, 3
    5.     dec ecx
    6. l1: bt  [edi], ecx   ; !
    7.     setc    al
    8.     test    ebx, ebx
    9.     jz  l2
    10.     xor ah, al
    11. l2: add bl, ah
    12.     mov ah, al
    13.     dec ecx
    14.     jnz l1
     
  4. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Важна скорость. Допустим сигнальная строка >= гигабиту.

    Сигнал непредсказуем. Но задача должна стремится хотя бы быть выполнена не более секунды. Понятно что могут быть участки (возможно большие) равномерного сигнала (низкого или высокого). И этим грех не воспользоваться.