fortpost
Высший разум
  
Offline
Сообщений: 6853
СПАСИБО
-вы поблагодарили: 1794
-вас поблагодарили: 2269
|
 |
� : Апрель 02, 2012, 23:43:00 � |
|
Как определить, является ли целое положительное число n целой степенью двойки, не используя циклы?
|
|
|
Записан
|
Лучший способ оказаться в дураках, это считать себя умнее других. Ф. Ларошфуко
|
|
|
moonlight
Умник
  
Offline
Сообщений: 741
СПАСИБО
-вы поблагодарили: 19
-вас поблагодарили: 232
|
 |
� Ответ #1 : Апрель 03, 2012, 00:54:33 � |
|
bool Pow2(int n) { return (n == 1 ? true : ((n & 1) == 1 ? false : Pow2(n >> 1))); }
|
|
|
Записан
|
Зачем откладывать на завтра то, что можно отложить на послезавтра?
|
|
|
iPhonograph
Гений-Говорун
Offline
Сообщений: 2100
СПАСИБО
-вы поблагодарили: 561
-вас поблагодарили: 1315
Дискоед
|
 |
� Ответ #2 : Апрель 03, 2012, 08:07:42 � |
|
посмотреть на логарифм
|
|
|
Записан
|
"Было бы величайшей ошибкой думать" (с) В.И.Ленин, Полн. cобр. cоч., т.34, стр.375
|
|
|
Вилли ☂
Гений-Говорун
Offline
Сообщений: 1572
СПАСИБО
-вы поблагодарили: 532
-вас поблагодарили: 722
☃
|
 |
� Ответ #3 : Апрель 03, 2012, 09:37:20 � |
|
в двоичном коде выглядетъ как 1000...000
|
|
|
Записан
|
|
|
|
fortpost
Высший разум
  
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
Сообщений: 6853
СПАСИБО
-вы поблагодарили: 1794
-вас поблагодарили: 2269
|
 |
� Ответ #5 : Апрель 03, 2012, 10:05:43 � |
|
посмотреть на логарифм
Та нема ж двоичных логарифмов в ЯПах, тока натуральные, а тогда погрешность может вылезть.
|
|
|
Записан
|
Лучший способ оказаться в дураках, это считать себя умнее других. Ф. Ларошфуко
|
|
|
fortpost
Высший разум
  
Offline
Сообщений: 6853
СПАСИБО
-вы поблагодарили: 1794
-вас поблагодарили: 2269
|
 |
� Ответ #6 : Апрель 03, 2012, 10:07:05 � |
|
в двоичном коде выглядетъ как 1000...000
Да, а дальше что с этим делать?
|
|
|
Записан
|
Лучший способ оказаться в дураках, это считать себя умнее других. Ф. Ларошфуко
|
|
|
Ivan A. Kosarev
Новенький
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); }
|
|
|
|
Вилли ☂
Гений-Говорун
Offline
Сообщений: 1572
СПАСИБО
-вы поблагодарили: 532
-вас поблагодарили: 722
☃
|
 |
� Ответ #8 : Апрель 03, 2012, 10:48:39 � |
|
* меняем первую единичку на нолик (или отбрасываем его) и число сравниваем с 0
* узнаём кол-во бит числа и сравниваем с соответствующей степенью двойки
* вычитаем единичку -> кол-во бит числа уменьшилось на один (1000 -> 0111)
* побитовый сдвиг влево/вправо и сравнение с исходным числом
|
|
� Последнее редактирование: Апрель 03, 2012, 11:08:24 от Вилли �
|
Записан
|
|
|
|
Вилли ☂
Гений-Говорун
Offline
Сообщений: 1572
СПАСИБО
-вы поблагодарили: 532
-вас поблагодарили: 722
☃
|
 |
� Ответ #9 : Апрель 03, 2012, 11:08:59 � |
|
-
|
|
|
Записан
|
|
|
|
kinder
Свой человек
 
Offline
Сообщений: 298
СПАСИБО
-вы поблагодарили: 10
-вас поблагодарили: 35
|
 |
� Ответ #10 : Апрель 03, 2012, 12:24:10 � |
|
ну вы даёте  return !(n&1);
|
|
|
Записан
|
|
|
|
Ivan A. Kosarev
Новенький
Offline
Сообщений: 3
СПАСИБО
-вы поблагодарили: 0
-вас поблагодарили: 2
|
 |
� Ответ #11 : Апрель 03, 2012, 12:26:05 � |
|
ну вы даёте  return !(n&1); Это проверка на четность. 
|
|
|
Записан
|
|
|
|
fortpost
Высший разум
  
Offline
Сообщений: 6853
СПАСИБО
-вы поблагодарили: 1794
-вас поблагодарили: 2269
|
 |
� Ответ #12 : Апрель 04, 2012, 00:17:43 � |
|
А можно так. Если 2n делится на n, то n является степенью двойки, если не делится, то не является.
|
|
|
Записан
|
Лучший способ оказаться в дураках, это считать себя умнее других. Ф. Ларошфуко
|
|
|
|