Естественные науки
Кто решит задачу по программированию!
Условие задачи:Дано целое число больше 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 - вроде на пару наносекунд быстрее работает...
Если в нём ровно одна единица, то ответ - да, иначе - нет.
Кратчайший и быстрейший вариант на ассемблере:
допустим, в регистре 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 - вроде на пару наносекунд быстрее работает...
В машинном представлении любая степень двойки - это 1 в одном каком-то разряде и нули в остальных (важно, что по условию рассматриваются именно ЦЕЛЫЕ числа, а не вещественные) . То есть нужно просто посмотреть, как выглядит это число во внутреннем представлении машины. На языке Модула-2 для этого можно использовать тип BITSET.
А фигли: берем от этого числа логорифм по основанию 2. И если он целый, то - да. Встроенные функции дают логарифм по другим основаниям, поэтому надо добавить формулу для приведения логарифма к другому основанию.
В двоичном представлении у такого числа будет только одна значащая единица:
2 в степени 0 = 0001b
2 в степени 1 = 0010b
2 в степени 2 = 0100b
2 в степени 3 = 1000b и так далее
очень хорошо поддается вычислению на языке assembler
делая смещение влево (команда shl )и аналируя флаг переполнения можно очень быстро сделать вычисление.
2 в степени 0 = 0001b
2 в степени 1 = 0010b
2 в степени 2 = 0100b
2 в степени 3 = 1000b и так далее
очень хорошо поддается вычислению на языке assembler
делая смещение влево (команда shl )и аналируя флаг переполнения можно очень быстро сделать вычисление.
Похожие вопросы
- Проверьте пожалуйста, как я решила задачу по химии. Ответа, к сожалению, у меня к этой задаче нет
- Помогите решить задачу
- Кто решит задачу по математике!
- Плиз,решите задачу по математику,умоляю!
- Кто решит задачу по механике!
- Кто решит задачу по математике!
- помогите решить задачи по Физической химии
- Помогите решить задачу по физике, пожалуйста! законы сохранения. упругое взаимодействие
- помогите решить задачу по Высшей математике, тема: Аналитическая геометрия
- Плз.. . Кто может помочь.. . Нужно срочно решить задачу по математике...