Как проверить является ли число степенью двойки

от admin

Русские Блоги

Число является степенью двойки, поэтому только одна из двоичных цифр числа равна 1.

Например: 10000, 100, 1 и т. Д.

Видно, что если вычесть это число из 1, двоичные цифры значения результата должны быть следующими: 1111, 11, 0 и т. Д.

Характеристики этих двух чисел: когда они делают или, результатом является их сумма, например:

Результат 10000 и 1111 равен 11111, результат 100 и 11 равен 111, 1 и 0 или 1.

Таким образом, мы можем определить, является ли число степенью 2, если мы реализуем метод:

Дополнение (еще один способ реализации):

Также может быть достигнуто путем сдвига на 1. Как упомянуто выше, если число является степенью двойки, то его двоичное представление имеет только одну цифру, поэтому, если число 1 смещено, оно всегда будет равно числу при его перемещении в определенный бит. Итак, эта реализация выглядит следующим образом:

Как проверить, является ли заданное число степенью двойки?

Как проверить, является ли заданное число степенью двойки.

Как можно это осуществить в C#?

Там по ссылке ещё много всяких битовых трюков.

Как это трюк работает? А вот как. Запишем число n в двоичной системе, и рассмотрим самую правую единицу в двоичном представлении числа n . У числа n — 1 будет на месте этой единицы ноль, а справа от него единицы:

а остальные двоичные цифры (обозначенные как x ) не поменяются. Поэтому после операции & получится вот что:

Это число будет равно нулю тогда и только когда, когда все xxxxxx равны нулю. Единственный случай, где наше соображение не проходит — число 0: там нету «самой правой» единицы вовсе, так что это случай приходится рассматривать отдельно.

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

Сегодня мне нужен простой алгоритм для проверки того, является ли число мощностью 2.

Алгоритм должен быть:

  • Простой
  • Корректно для любого значения ulong .

Я придумал этот простой алгоритм:

Но потом я подумал, как насчет проверки того, является ли log2 x точно круглым числом? Но когда я проверил 2 ^ 63 + 1, Math.Log вернул ровно 63 из-за округления. Итак, я проверил, соответствует ли 2 мощности 63 исходному числу, и это потому, что вычисление выполняется в double , а не в точном числе:

Это возвращало true для данного неправильного значения: 9223372036854775809 .

Есть ли лучший алгоритм?

22 ответа

Там простой трюк для этой проблемы:

Обратите внимание: эта функция будет сообщать значение true для 0 , что не является значением 2 . Если вы хотите исключить это, вот как:

объяснение

Прежде всего, побитовый двоичный оператор из определения MSDN:

Бинарные и операторы предопределены для интегральных типов и bool. Для интегральных типов & вычисляет логическое побитовое И его операндов. Для операндов bool и вычисляет логический AND своих операндов; то есть результат верен тогда и только тогда, когда оба его операнда верны.

Теперь давайте посмотрим, как все это происходит:

Функция возвращает boolean (true/false) и принимает один входящий параметр типа unsigned long (x, в этом случае). Для простоты предположим, что кто-то прошел значение 4 и назвал функцию так:

Теперь мы заменяем каждое вхождение x на 4:

Читать:
Как найти максимальную скорость фотоэлектронов

Ну, мы уже знаем, что 4! = 0 оценивает истину, пока что так хорошо. Но что насчет:

Это, конечно же, означает:

Но что такое 4&3 ?

Бинарное представление 4 равно 100, а двоичное представление 3 равно 011 (помните, что & берет двоичное представление этих чисел). Таким образом, мы имеем:

Представьте, что эти значения сложены как элементарное дополнение. Оператор & говорит, что если оба значения равны 1, то результат равен 1, иначе оно равно 0. Итак, 1 & 1 = 1 , 1 & 0 = 0 , 0 & 0 = 0 и 0 & 1 = 0 . Итак, мы делаем математику:

Результат — просто 0. Итак, мы вернемся и посмотрим, что теперь означает наш оператор return:

Это переводит теперь:

Мы все знаем, что true && true просто true , и это показывает, что для нашего примера 4 — это сила 2.

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

сегодня мне нужен простой алгоритм для проверки, является ли число степенью числа 2.

алгоритм должен быть:

  1. простой
  2. необходимая для любого ulong значение.

Я придумал такой простой алгоритм:

но потом я подумал, как насчет проверки, если log2 x — Это точно круглое число? Но когда я проверил 2^63+1, Math.Log вернулся ровно 63 из-за округлений. Так я проверил, если 2 к мощность 63 равна исходному числу — и это так, потому что расчет производится в double s и не в точных числах:

вернуть true для данного неправильного значения: 9223372036854775809 .

есть ли лучший алгоритм?

21 ответов:

есть простой трюк для этой проблемы:

обратите внимание, эта функция будет отчет true на 0 , который не является силой 2 . Если вы хотите исключить это, вот как:

объяснение

прежде всего побитовый двоичный оператор & из определения MSDN:

бинарные & операторы предопределены для интегральных типов и bool. Для целочисленные типы, & вычисляет логический побитовый И его операндов. Для операндов bool & вычисляет логическое и его операндов; что результат true если и только если оба ее операнда истинны.

теперь давайте посмотрим, как все это происходит:

функция возвращает логическое значение (true / false) и принимает один входящий параметр типа unsigned long (x, в данном случае). Давайте для простоты предположим, что кто-то передал значение 4 и вызвал функцию типа Итак:

теперь мы заменяем каждое вхождение x на 4:

Ну мы уже знаем, что 4 != 0 evals к истине, до сих пор так хорошо. Но как насчет:

это, конечно, переводится так:

но что же такое 4&3 ?

двоичное представление 4 равно 100, а двоичное представление 3-011 (помните, что & принимает двоичное представление этих чисел). Так что мы есть:

представьте, что эти значения складываются так же, как элементарное сложение. Элемент & оператор говорит, что если оба значения равны 1, то результат 1, иначе 0. Так что 1 & 1 = 1 , 1 & 0 = 0 , 0 & 0 = 0 и 0 & 1 = 0 . Итак, мы делаем математику:

результат просто 0. Итак, мы возвращаемся и смотрим на то, что теперь переводит наше заявление о возврате:

что переводится сейчас к:

мы все это знаем true && true просто true , и это показывает, что для нашего примера 4-это степень 2.

Похожие статьи