· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Микроупражнение: степень двойки

. 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Апр 15, 2004 22:17:04

В регистре EAX находится беззнаковое натуральное число.
Определить, является ли это число целой степенью двойки.


Дата: Апр 15, 2004 22:35:05

Если считать единицу степенью двойки(нулевой) то тогда такой код, без цикла не придумать.

dec eax

@@loop:
shr eax, 1
jc @@loop

test eax, eax
jz @@even

@@no_even:
;...

@even:
;...


Дата: Апр 15, 2004 23:01:09

Наверно, так можно:

bsf eax,ebx
bsr eax,edx
or ebx,edx
sub ebx,31
jz @PowerOf2


Дата: Апр 15, 2004 23:05:57

ECk
тогда уж так

bsf eax, ebx
jz @@null
bsr eax, edx
cmp ebx, edx
jz @@even

просто эти команды вроде очень медленными считаются.


Дата: Апр 15, 2004 23:12:03

Не так, а так:
------------------------------
bsf ebx,eax
bsr ecx,eax
jz _no
cmp ebx,ecx
je _yes
_no:
------------------------------


Дата: Апр 15, 2004 23:14:16

>cmp ebx, edx
>jz @@even
Почему обязательно even?
Если ebx = 1 и edx = 1 это не степень 2, а любое число вида 01хххххххххххххххххххххххххххх10b и это не обязательно степень двойки (в степени двойки единица встречается только один раз - на первом месте, т.е MSB, т.е сумма bsf и bsr будет равна 31 если единица встречается только один раз, а один раз она встречается только в степени двойки)
Но без цикла, как подсказывает опыт, быстрее бывает


Дата: Апр 15, 2004 23:28:11

Вроде как bsf и bsr пишут во второй операнд позицию, начиная с нулевого бита, если не так, то похоже пора асм заново учить :)


Дата: Апр 15, 2004 23:29:23

сорри


Дата: Апр 16, 2004 00:00:08

mov ecx,eax
dec eax
and ecx,eax
jecxz _yes
_no:
_yes:

/*
(var & (var--)) = (var без самой правой единицы в двоичной записи)
*/


Дата: Апр 16, 2004 00:15:03

Loger

Именно!
PAGE:004A015D                 lea     ecx, [eax-1]
PAGE:004A0160                 test    eax, ecx
PAGE:004A0162                 jnz     loc_4ED84B


captain cobalt
является ли это число целой степенью двойки

Слушай, а что, бывают НЕцелые степени двойки 8-)


Дата: Апр 16, 2004 10:20:15

2volodya:
Слушай, а что, бывают НЕцелые степени двойки 8-)
ну если учесть что у нас двоичная система счисления, то любое число можно представить как соответствующую степень двойки, а вот целая степень это 1, 2, 4, 8 ... :)))) (сейчас меня будут пинать:)


Дата: Апр 16, 2004 10:56:55

Эх... быстро всё разломали...

volodya
[ Слушай, а что, бывают НЕцелые степени двойки 8-) ]

Конечно! Бывают даже целые числа, являющиеся нецелыми степенями двойки ;)

В связи с этим, следующее упражнение:
Определить является ли EAX целой степенью тройки.


Дата: Апр 16, 2004 11:07:39

Э, нет. Какое следующее упражнение? Вы же еще с предыдущим не до конца справились :)
Предлагаю свой вариант (основная часть идеи нагло спёрта у предыдущих ораторов):

mov ecx, eax
dec ecx
jc _no
test ecx,eax
jnz _no
_yes:


Дата: Апр 16, 2004 11:16:55

RobinFood
Как не до конца? Volodya ж уже решил за 3 операции, причем быстрые.


Дата: Апр 16, 2004 11:18:51

Угу, решил... и его вариант почему-то уверен, что 0 - это степень двойки...

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.062