Естественные науки

Кто решит задачу по программированию!

Условие задачи:Дано целое число больше 0. Определить, является ли оно целой степенью 2.Достаточно указать алгоритм (принцип решения). Язык программирования можно использовать любой.
Берём двоичное представление числа.
Если в нём ровно одна единица, то ответ - да, иначе - нет.

Кратчайший и быстрейший вариант на ассемблере:
допустим, в регистре ecx находится исходное число.
bsf eax, ecx
jz not_bin
bsr ebx, ecx
cmp eax, ebx
jne not_bin
;; Если дошли до сюда, это число - степень двойки
not_bin:
;; Если дошли до сюда, число - НЕ степень двойки

P. S. команды bsf, bsr есть только в Pentium III и выше

Можно ещё выпендриться и вместо cmp использовать xor - вроде на пару наносекунд быстрее работает...
АД
Александр Довидович
54 366
Лучший ответ
В машинном представлении любая степень двойки - это 1 в одном каком-то разряде и нули в остальных (важно, что по условию рассматриваются именно ЦЕЛЫЕ числа, а не вещественные) . То есть нужно просто посмотреть, как выглядит это число во внутреннем представлении машины. На языке Модула-2 для этого можно использовать тип BITSET.
А фигли: берем от этого числа логорифм по основанию 2. И если он целый, то - да. Встроенные функции дают логарифм по другим основаниям, поэтому надо добавить формулу для приведения логарифма к другому основанию.
Ан
Ангел
5 769
В двоичном представлении у такого числа будет только одна значащая единица:
2 в степени 0 = 0001b
2 в степени 1 = 0010b
2 в степени 2 = 0100b
2 в степени 3 = 1000b и так далее
очень хорошо поддается вычислению на языке assembler

делая смещение влево (команда shl )и аналируя флаг переполнения можно очень быстро сделать вычисление.