08.12.2006, 19:55
общий
это ответ
Здравствуйте, Golden Spider!
из твоего кода становится понятно, что если исходное значение равно исключаемому, то значение в целевой массив не переписывается, а просто пропускается?
вообще, современные компиляторы С++ действительно хорошо оптимизируют код, так что прежде всего нужно посмотреть, что сгенерит тут компилятор.
на мой взгляд, место для улучшения - это условные переходы. процессор сильно тормозит, если не угадывает условный переход, поэтому условные переходы лучше исключать. предлагаю код в приложении. он не изменяет содержимое ячеек памяти целевого массива, если в исходном на соотв. месте стоит код исключения. если туда можно записывать, например, 0 на это место, код упрощается.
в коде использован метод cmp + sbb для избежания условного перехода.
также можно попробовать реализовать данную задачу с помощью ММХ (оно как раз заточено под 16-ти разрядные числа).
Приложение:
mov bx, [size] mov si, [src] dec bx mov di, [dst] mov cx, [exclude] shl bx, 1m1: mov ax, [si + bx] ; if current word must be excluded: sub ax, cx ; ax = 0 cmp ax, 1 ; C flag is set sbb dx, dx ; dx = 0xFFFF mov bp, dx ; bp = 0xFFFF xor dx, 0xFFFF ; dx = 0 and bp, [di + bx] and dx, [si + bx] or dx, bp sub bx, 2 mov [di + bx], dx jnc m1