Посчитать нули в слове
Модератор: Andy
Подскажите пожалуйста, как посчитать количество нулей в слове? Может алгоритм какой есть(команда)?
Алгоритм есть, как и у любой задачи. Способов довольно много, можно пользоваться сдвигом, а можно использовать другие инструкции:
BTC op1, op2 (Bit Test and Compliment) - помещает инвертированное значение бита op1, указанного в op2 во флаг CF. Исходя из этого легко считаются нули:
На выходе в CH будет содержаться кол-во нулей.
BTC op1, op2 (Bit Test and Compliment) - помещает инвертированное значение бита op1, указанного в op2 во флаг CF. Исходя из этого легко считаются нули:
Код: Выделить всё
...
mov ax, YourWord
sub cx, cx
@k1:
btc ax, cl
adc ch, 0
inc cl
cmp cl, 16
jnz @k1
...
It's a long way to the top if you wanna rock'n'roll
Такой вариант у меня не прошел. TASM выдавал ошибку на строчке
btc ax, cl
Как я понял, команда btc для процессоров 386 и i486. Зато немного подумав, воспользовался сдвиговой операцией shr :
mov ax, MyWord
xor cx, cx
xor dx, dx
mov dx, 16
mov cl, 1
@k1:
shr ax, cl
adc ch, 0
dec dx
jnz @k1
mov al,16
sub al,ch
В цикле посчитали единицы, а потом вычли их из 16 = количество нулей
PS thanks developer за идею.
btc ax, cl
Как я понял, команда btc для процессоров 386 и i486. Зато немного подумав, воспользовался сдвиговой операцией shr :
mov ax, MyWord
xor cx, cx
xor dx, dx
mov dx, 16
mov cl, 1
@k1:
shr ax, cl
adc ch, 0
dec dx
jnz @k1
mov al,16
sub al,ch
В цикле посчитали единицы, а потом вычли их из 16 = количество нулей
PS thanks developer за идею.