|
|
| Посл.отвђт | Сообщен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 - это степень двойки... |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.062 |