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

var s = "1";replaced word
var a = "HRA"; //have to replace 
var str = document.getElementById("test").innerHTML;
var count = str.split(a).length - 1;
for (var i = 0; i < count; i++) {
    var s = "1";
    var a = "HRA";
    var str = document.getElementById("test").innerHTML;
    var res = str.replace(a, s);
    document.getElementById("test").innerHTML = res;
}

<input " type="button" id="Btn_Validate" value="Validate" class="btn btn-info" />
<div class="textarea"  id="test" contenteditable="true">HRABHRA</div>

537
задан configurator 29 March 2015 в 14:42
поделиться

10 ответов

Существует простой прием для этой проблемы:

bool IsPowerOfTwo(ulong x)
{
    return (x & (x - 1)) == 0;
}

Примечание, эта функция сообщит true для [1 112], который не является питанием [1 113]. Если Вы хотите исключить это, вот то, как:

bool IsPowerOfTwo(ulong x)
{
    return (x != 0) && ((x & (x - 1)) == 0);
}

Объяснение

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

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

Теперь позволяют нам смотреть на то, как это все теряет значение:

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

bool b = IsPowerOfTwo(4)

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

return (4 != 0) && ((4 & (4-1)) == 0);

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

((4 & (4-1)) == 0)

Это переводит в это, конечно:

((4 & 3) == 0)

, Но что точно 4&3?

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

100 = 4
011 = 3

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

100
011
----
000

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

return (4 != 0) && ((4 & 3) == 0);

, Который переводит теперь в:

return true && (0 == 0);
return true && true;

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

1136
ответ дан Marco Bonelli 30 March 2015 в 00:42
поделиться
  • 1
    Можно всегда проверять источник. Если Вы используете сублимированный текстовый хит cmd + t и тип FormBuilder. Помните, что платформа является частью Вашего приложения, просто потому что Вы can' t непосредственно изменяют исходный код doesn' t означают, что Вы не должны быть знакомы с кодом там. – Bastian Hofmann 5 September 2013 в 17:44
int isPowerOfTwo(unsigned int x)
{
    return ((x != 0) && ((x & (~x + 1)) == x));
}

Это действительно быстро. Проверка всех 2 ^ 32 целых чисел занимает около 6 минут и 43 секунды.

4
ответ дан Stephan Bauer 29 March 2015 в 14:42
поделиться

Недавно я написал статью об этом на http://www.exploringbinary.com/ten-ways-to-check-if-an-integer-is-a-power-of-two-in- с / . Он охватывает подсчет битов, правильное использование логарифмов, классическую проверку «x & amp;! (X & amp; (x - 1))» и другие.

20
ответ дан Rick Regan 29 March 2015 в 14:42
поделиться

Найдите, является ли данное число степенью 2.

#include <math.h>

int main(void)
{
    int n,logval,powval;
    printf("Enter a number to find whether it is s power of 2\n");
    scanf("%d",&n);
    logval=log(n)/log(2);
    powval=pow(2,logval);

    if(powval==n)
        printf("The number is a power of 2");
    else
        printf("The number is not a power of 2");

    getch();
    return 0;
}
4
ответ дан Bastien Léonard 29 March 2015 в 14:42
поделиться

После регистрации вопроса я думал о следующем решении:

Мы должны проверить, является ли точно одна из двоичных единиц информации той. Таким образом, мы просто смещаемся, число исправляют одну цифру за один раз и возврат true, если это равняется 1. Если в какой-либо точке мы приезжаем нечетным числом ((number & 1) == 1), мы знаем, что результат false. Это доказало (использование сравнительного теста) немного быстрее, чем исходный метод для (больших) истинных значений и намного быстрее для лжи или маленьких значений.

private static bool IsPowerOfTwo(ulong number)
{
    while (number != 0)
    {
        if (number == 1)
            return true;

        if ((number & 1) == 1)
            // number is an odd number and not 1 - so it's not a power of two.
            return false;

        number = number >> 1;
    }
    return false;
}
<час>

, Конечно, решение Greg намного лучше.

10
ответ дан configurator 30 March 2015 в 00:42
поделиться

Некоторые сайты, что документ и объясняет это и другие взломы битового жонглирования:

И дедушка их, книга "Восхищение Хакера" Henry Warren Jr. :

Как , который объясняет страница Sean Anderson, выражение ((x & (x - 1)) == 0) неправильно указывает, что 0 питание 2. Он предлагает использовать:

(!(x & (x - 1)) && x)

для исправления той проблемы.

95
ответ дан chqrlie 30 March 2015 в 00:42
поделиться

return (i & -i) == i

39
ответ дан 22 November 2019 в 22:20
поделиться
private static bool IsPowerOfTwo(ulong x)
{
    var l = Math.Log(x, 2);
    return (l == Math.Floor(l));
}
0
ответ дан 22 November 2019 в 22:20
поделиться
bool IsPowerOfTwo(ulong x)
{
    return x > 0 && (x & (x - 1)) == 0;
}
22
ответ дан 22 November 2019 в 22:20
поделиться

Вот простое решение C ++ :

bool IsPowerOfTwo( unsigned int i )
{
    return std::bitset<32>(i).count() == 1;
}
17
ответ дан 22 November 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: