У меня есть программа php, которая проверяет, является ли данное положительное целое число в два раза или нет.! Вот код .. [duplicate]

Надеемся, что установка force_color_prompt=yes директивы в вашем файле .bashrc заставит ее работать. Директива force_color_prompt=yes комментируется по умолчанию. Раскройте его, сохраните его и отправьте в файл .bashrc, чтобы увидеть изменения.

Команда для поиска вашего файла .bashrc:

cd ~
source .bashrc
32
задан 28 June 2009 в 01:44

5 ответов

После выполнения программы на C будет выяснено, имеет ли число значение 2, а также найдет, какая мощность равна 2, номер.

#include<stdio.h>
void main(void)
{
    unsigned int a;
    unsigned int count=0
    unsigned int check=1;
    unsigned int position=0;
    unsigned int temp;
    //get value of a
    for(i=0;i<sizeof(int)*8;i++)//no of bits depend on size of integer on that machine
    {
        temp = a&(check << i);
        if(temp)
        {
            position = i;
            count++;
        }
    }
    if(count == 1)
    {
        printf("%d is 2 to the power of %d",a,position);
    }
    else
    {
        printf("Not a power of 2");
    }
}

Существуют и другие способы сделать это: - если число - это значение 2, только один бит будет установлен в двоичном формате

, например, 8 эквивалентен 0x1000, вычитая 1 из этого, получаем 0x0111.

Завершить операцию с исходным номером (0x1000) дает 0.

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

    void IsPowerof2(int i)
    {
    if(!((i-1)&1))
    {
    printf("%d" is a power of 2, i);
    }
    }

, другой способ может быть таким: -

Если мы возьмем дополнение числа, которое является степенью 2,

, например, дополнения 8, т. е. 0x1000, получим 0x0111 и добавим 1 к нему, получим

то же число, если это так, это число равно 2

    void IsPowerof2(int i)
    {
    if(((~1+1)&i) == 1)
    {
    printf("%d" is a power of 2,i):
    }
    }                                                     
-1
ответ дан 15 August 2018 в 15:58
  • 1
    Пожалуйста, объясните , как отвечает на вопрос. «Вот некоторые другие способы сделать то же самое». не обеспечивает просвещение, которое было запрошено. – Toby Speight 5 April 2017 в 11:31

Разъясняется здесь красиво

. Также указанное выражение считает, что 0 является степенью 2. Чтобы исправить это, используйте !(x & (x - 1)) && x;.

3
ответ дан 15 August 2018 в 15:58
  • 1
    Нет, это не правильно. Нет x таких, что 2 ** x = 0. Следовательно, x не является степенью 2. – Accipitridae 28 June 2009 в 18:29

Определяет, является ли целое число мощностью 2 или нет. Если (x & (x-1)) равно нулю, то это число равно 2.

Например, пусть x будет 8 (1000 в двоичном виде); то x-1 = 7 (0111).

if    1000
  &   0111
---------------
      0000

C программа для демонстрации:

#include <stdio.h>

void main()
{
    int a = 8;
    if ((a&(a-1))==0)
    {
        printf("the bit is power of 2  \n");
    }
    else 
    {
        printf("the bit is not power of 2\n");
    }
}

Это выводит the bit is power of 2.

#include <stdio.h>

void main()
{
    int a = 7;
    if ((a&(a-1))==0)
    {
        printf("the bit is power of 2  \n");
    }
    else 
    {
        printf("the bit is not power of 2\n");
    }
}

Это выводит the bit is not power of 2.

1
ответ дан 15 August 2018 в 15:58

Ну,

, если у вас X = 1000, тогда x-1 = 0111. И 1000 & amp; & amp; 0111 равно 0000.

Каждое число X, являющееся степенью 2, имеет x-1, у которого есть единицы в положении x, имеет нули. И побитовое и 0 и 1 всегда равно 0.

Если число x не является степенью двух, например 0110. x-1 - 0101, а и дает 0100.

Для всех комбинаций в пределах 0000 - 1111 это приводит к

   X  X-1 X && X-1  
0000 1111 0000   
0001 0000 0000 
0010 0001 0000
0011 0010 0010
0100 0011 0000
0101 0100 0100
0110 0101 0100
0111 0110 0110
1000 0111 0000
1001 1000 1000
1010 1001 1000
1011 1010 1010
1100 1011 1000
1101 1100 1100
1110 1101 1100
1111 1110 1110

И нет необходимости в отдельной проверке на 1.

6
ответ дан 15 August 2018 в 15:58
  • 1
    Но, конечно, необходимо проверить значение 0, так как 0 не является степенью 2, но проверяет, как будто это так. – Steve Jessop 28 June 2009 в 02:58
  • 2
    Несколько вещей здесь - во-первых, я думаю, вы используете && несколько мест, где вы имели в виду &. n && (n-1) будет 1 почти всюду (кроме n = 0 и n = 1, справа?) Во-вторых, 1 является степенью 2, но «требуется» зависит от контекста, который мы никогда не видели («истинно, если сила положительная / естественная», или, наоборот, «истинна, если только один бит установлен» и т. д.) Ничего личного, это было почти десять лет назад в любом случае. – John P 19 February 2018 в 15:56

Ну, первый случай будет проверять на 20 == 1.

В остальных случаях играет роль num & (num - 1):

Это говорит, что если вы берете какое-либо число, и замаскируйте биты с одного нижнего, вы получите один из двух случаев:

, если число уже равно двум, тогда одно меньше приведет к двоичному числу, биты заказа. Используя & ничего не будет делать. Пример с 8: 0100 & (0100 - 1) -> (0100 & 0011) -> 0000, если число не равно двум из двух, тогда одно меньше не будет касаться наивысшего бита, поэтому результат будет по меньшей мере наибольшей мощностью из двух меньше, чем num. Пример с 3: 0011 & (0011 - 1) -> (0011 & 0010) -> 0010 Пример с 13: 1101 & (1101 - 1) -> (1101 & 1100) -> 1100

Таким образом, фактическое выражение находит все, что не является силой двух, в том числе 2 0 .

14
ответ дан 15 August 2018 в 15:58
  • 1
    Собственно, проверка специального случая num==1 (2 ^ 0 = 1) не требуется. Для этого случая (num & amp; (num-1)) = (1 & amp; 0) = 0 в любом случае. – farindk 8 May 2014 в 19:18
  • 2
    Объяснение второй точки неверно, (num-1) может быть степенью двух, но не обязательно так. Причина, по которой результат всегда отлична от нуля, состоит в том, что операция всегда будет выполняться , не касаясь старшего бита, и по крайней мере этот бит будет отображаться на выходе. – Ismael Luceno 19 December 2014 в 00:53
  • 3
    Комментарий Исмаила Луцено - лучшее объяснение этого наблюдения – Ketcomp 23 July 2016 в 21:17
  • 4
    как отмечено в комментариях выше, утверждение в пункте 2: «, которое возвращает наивысшую степень 2 не больше num», неверно. Он должен более точно читать ", который возвращает как минимум наивысшую степень 2, не превышающую num". Я отредактировал этот ответ, и он ждет экспертной оценки. – xdavidliu 5 July 2018 в 03:05

Другие вопросы по тегам:

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