Русские Блоги
Число является степенью двойки, поэтому только одна из двоичных цифр числа равна 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.
алгоритм должен быть:
- простой
- необходимая для любого 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.