|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 26, 2003 18:19:56 На форуме dore.ru, какой-то чел просит помочь, с решением такой задачи: "Определить кол-во едениц в диапазоне между 5 и 14 разрядами в слове" Я вот набросал решение, но думаю его можно значитьльно улучшить, кто поможет?...
...
...
xor esi,esi
mov ax,1100100101010101b
; \________/
; 14 5
mov cx,14 ; начнем с "14" бита
_scan:
bt ax,cx
jnc _bin_set_0
inc esi ; в SI будет число бит равных "1"
_bin_set_0:
dec cx
cmp cx,4
jne _scan
...
...
|
|
|
Дата: Сен 26, 2003 18:51:09 · Поправил: masquer Можно и так. xor ebx, ebx mov eax, 1100100101010101b mov ecx, 14-4 shr eax, 5 @@: adc ebx,0 dec ecx rcr eax, 1 jns @BА оптимизировать надо по размеру или скорости? Да, количество единичек в ebx |
|
|
Дата: Сен 26, 2003 18:54:07 masquer Да по баробану, скучно мне вот и пытаюсь себя чем нибудь развлеч... |
|
|
Дата: Сен 26, 2003 18:55:59 KiNDeR ОГО??? Нифига себе СЧАСТЛИВЫЙ %)))))))))))) |
|
|
Дата: Сен 26, 2003 18:58:06 Edmond Ну что я поделаю, если вдохновение меня покинуло. Вот и хватаюсь за разные задачи... :)) (правда не всегда удачно...:)))) |
|
|
Дата: Сен 26, 2003 19:16:03
mov ax,12345 ;4
mov ebx,7fe0h ;5
xor esi,esi ;2
dec esi ;1
.l0:
inc esi ;1
and ebx,eax ;2
lea eax,[ebx-1] ;3
jnz .l0 ;2
PS: А слово обязательно сохранять? |
|
|
Дата: Сен 26, 2003 20:38:47 Да, долго как-то получается... Ничего, даст Господь, разбогатеем, купим себе по Итаниуму и будем считать биты одной инструкцией: .data MyData: data8 1100100101010101b ... .text movl r5=MyData;; ld8 r1=[r5];; // Число в r1 addl r2=0x3ff0,r0;; // sext imm22 маску в r2 and r3=r1,r2;; // popcnt r4=r3;; // в r4 - число бит! //Да здравствует Ытаниум! |
|
|
Дата: Сен 27, 2003 00:52:29 Вот еще вариант: mov ax,1100100101010101b xor bx,bx and ax,7fe0h loop: rcr ax,1 adc bl,bh or ax,ax jnz loop результат в bl итого 16 байт, 7 тактов (просто подсчитаны такты выполнения команд) |
|
|
Дата: Ноя 6, 2003 13:21:04 2 Johnikum - я взял и улучшил твой код на целый байт :), но у тебя ошибка - rcr вращает биты по кругу, ах будет равен нулю только если имеется 1 ненулевой бит :) или все биты нулевые - нужен shl (shr не берем, потому что нулевых битов справа больше (4 штуки) против 1 нулевого бита слева - цикл закончится быстрее). Вместо or reg,reg лучше применять test reg,reg - при этом процессор не тратит время на запись ax в ax (см. оптимизация :) получилось: mov ax,1100100101010101b and ax,7fe0h cwd ;15bit ax=0, dx=0 loop: shl ax,1 adc dl,dh test ax,ax jnz loop результат в dl/dx но позалипав еще полчасика(как сохранить флаг нуля, чтобы не юзать Test ax,ax), убрал еще байт: mov ax,1100100101010101b and ax,7fe0h cwd ;15bit ax=0, dx=0 loop: shl ax,1 jnc no_inc_count ; если CF=1 идем проверять на ax=0? :) inc dx ; после inc ZF=0 будет всегда в нашем случае no_inc_count: jnz loop если подумать... хз, может еще можно уменьшить :) |
|
|
Дата: Ноя 6, 2003 22:46:26 MrAssembler но у тебя ошибка - rcr вращает биты по кругу, ах будет равен нулю только если имеется 1 ненулевой бит Ошибки не будет!!! 1. Команда AND ax,7FE0h обнуляет флаг CF 2. Команда ADC bl,bh, тоже не вызовет переноса, так что и здесь CF=0 ;-) |
|
|
Дата: Ноя 10, 2003 13:17:31 я сам заметил, уже послав сообщение. :) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.069 |