Страниц: [1]
  Печать  
Автор Тема: Степень двойки  (Прочитано 8362 раз)
0 Пользователей и 1 Гость смотрят эту тему.
fortpost
Высший разум
****
Offline Offline

Сообщений: 6853

СПАСИБО
-вы поблагодарили: 1794
-вас поблагодарили: 2269



Просмотр профиля
: Апрель 02, 2012, 23:43:00 �

Как определить, является ли целое положительное число n целой степенью двойки, не используя циклы?
Записан

Лучший способ оказаться в дураках, это считать себя умнее других. Ф. Ларошфуко
moonlight
Умник
****
Offline Offline

Сообщений: 741

СПАСИБО
-вы поблагодарили: 19
-вас поблагодарили: 232


Просмотр профиля Email
Ответ #1 : Апрель 03, 2012, 00:54:33 �

Код:
        bool Pow2(int n)
        {
            return (n == 1 ? true : ((n & 1) == 1 ? false : Pow2(n >> 1)));
        }
Записан

Зачем откладывать на завтра то, что можно отложить на послезавтра?
iPhonograph
Гений-Говорун
*
Offline Offline

Сообщений: 2100

СПАСИБО
-вы поблагодарили: 561
-вас поблагодарили: 1315

Дискоед


Просмотр профиля
Ответ #2 : Апрель 03, 2012, 08:07:42 �

посмотреть на логарифм
Записан

"Было бы величайшей ошибкой думать" (с) В.И.Ленин, Полн. cобр. cоч., т.34, стр.375
Вилли ☂
Гений-Говорун
*
Offline Offline

Сообщений: 1572

СПАСИБО
-вы поблагодарили: 532
-вас поблагодарили: 722





Просмотр профиля
Ответ #3 : Апрель 03, 2012, 09:37:20 �

в двоичном коде выглядетъ как 1000...000
Записан
fortpost
Высший разум
****
Offline Offline

Сообщений: 6853

СПАСИБО
-вы поблагодарили: 1794
-вас поблагодарили: 2269



Просмотр профиля
Ответ #4 : Апрель 03, 2012, 10:03:07 �

Код:
        bool Pow2(int n)
        {
            return (n == 1 ? true : ((n & 1) == 1 ? false : Pow2(n >> 1)));
        }
А тута рекурсия - это тот же цикл, только ишшо хуже.
Записан

Лучший способ оказаться в дураках, это считать себя умнее других. Ф. Ларошфуко
fortpost
Высший разум
****
Offline Offline

Сообщений: 6853

СПАСИБО
-вы поблагодарили: 1794
-вас поблагодарили: 2269



Просмотр профиля
Ответ #5 : Апрель 03, 2012, 10:05:43 �

посмотреть на логарифм
Та нема ж двоичных логарифмов в ЯПах, тока натуральные, а тогда погрешность может вылезть.
Записан

Лучший способ оказаться в дураках, это считать себя умнее других. Ф. Ларошфуко
fortpost
Высший разум
****
Offline Offline

Сообщений: 6853

СПАСИБО
-вы поблагодарили: 1794
-вас поблагодарили: 2269



Просмотр профиля
Ответ #6 : Апрель 03, 2012, 10:07:05 �

в двоичном коде выглядетъ как 1000...000
Да, а дальше что с этим делать?
Записан

Лучший способ оказаться в дураках, это считать себя умнее других. Ф. Ларошфуко
Ivan A. Kosarev
Новенький
*
Offline Offline

Сообщений: 3

СПАСИБО
-вы поблагодарили: 0
-вас поблагодарили: 2


Просмотр профиля
Ответ #7 : Апрель 03, 2012, 10:46:21 �

Степень двойки в двоичном представлении -- это единственный взведенный разряд в какой-либо позиции. Если в двоичном представлении степени двойки единственный взведенный разряд имеет позицию b, тогда у числа на единицу меньшего этой степени двойки все разряды младше b будут взведены, а все остальные, включая разряд в позиции b, сброшены. Значит, степень двойки -- это число, которое не равно нулю и не имеет общих взведенных разрядов с числом, на единицу меньшим этой степени двойки.

Код:
int is_power_of_two(unsigned n)
{
    return (n != 0 && (n & (n - 1)) == 0);
}

Эти пользователи сказали вам СПАСИБО :

Вилли ☂

За это сообщение 1 пользователь сказал спасибо!
Записан
Вилли ☂
Гений-Говорун
*
Offline Offline

Сообщений: 1572

СПАСИБО
-вы поблагодарили: 532
-вас поблагодарили: 722





Просмотр профиля
Ответ #8 : Апрель 03, 2012, 10:48:39 �

* меняем первую единичку на нолик (или отбрасываем его) и число сравниваем с 0

* узнаём кол-во бит числа и сравниваем с соответствующей степенью двойки

* вычитаем единичку -> кол-во бит числа уменьшилось на один   (1000 -> 0111)

* побитовый сдвиг влево/вправо и сравнение с исходным числом


Последнее редактирование: Апрель 03, 2012, 11:08:24 от Вилли Записан
Вилли ☂
Гений-Говорун
*
Offline Offline

Сообщений: 1572

СПАСИБО
-вы поблагодарили: 532
-вас поблагодарили: 722





Просмотр профиля
Ответ #9 : Апрель 03, 2012, 11:08:59 �

-
Записан
kinder
Свой человек
***
Offline Offline

Сообщений: 298

СПАСИБО
-вы поблагодарили: 10
-вас поблагодарили: 35


Просмотр профиля
Ответ #10 : Апрель 03, 2012, 12:24:10 �

ну вы даёте Smiley
return !(n&1);
Записан
Ivan A. Kosarev
Новенький
*
Offline Offline

Сообщений: 3

СПАСИБО
-вы поблагодарили: 0
-вас поблагодарили: 2


Просмотр профиля
Ответ #11 : Апрель 03, 2012, 12:26:05 �

ну вы даёте Smiley
return !(n&1);

Это проверка на четность. Smiley
Записан
fortpost
Высший разум
****
Offline Offline

Сообщений: 6853

СПАСИБО
-вы поблагодарили: 1794
-вас поблагодарили: 2269



Просмотр профиля
Ответ #12 : Апрель 04, 2012, 00:17:43 �

А можно так. Если 2n делится на n, то n является степенью двойки, если не делится, то не является.
Записан

Лучший способ оказаться в дураках, это считать себя умнее других. Ф. Ларошфуко
Страниц: [1]
  Печать  
 
Перейти в: