Как проверить, является ли число степенью 2C#

Место общения программистов C#
Ответить
Anonymous
 Как проверить, является ли число степенью 2

Сообщение Anonymous »

Сегодня мне нужен был простой алгоритм проверки того, является ли число степенью 2.
Алгоритм должен быть:
  • Просто
  • Правильно для любого значения ulong.
Я придумал этот простой алгоритм:

Код: Выделить всё

private bool IsPowerOfTwo(ulong number)
{
if (number == 0)
return false;

for (ulong power = 1; power > 0; power = power  number)
return false;
}
return false;
}
Но потом я подумал: как насчет проверки того, является ли log2 x точно круглым числом? Когда я проверил 2^63+1, Math.Log() вернул ровно 63 из-за округления. Поэтому я проверил, равно ли 2 в 63-й степени исходному числу, и это так, потому что расчет выполняется в двойных, а не в точных числах.

Код: Выделить всё

private bool IsPowerOfTwo_2(ulong number)
{
double log = Math.Log(number, 2);
double pow = Math.Pow(2, Math.Round(log));
return pow == number;
}
Это вернуло true для заданного неправильного значения: 9223372036854775809.
Есть ли лучший алгоритм?

Подробнее здесь: https://stackoverflow.com/questions/600 ... power-of-2
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»