Подтвердить что ты не робот

Условная проверка для "i == (2 ^ 8)" не выполняется, когда я равно 512?

Вот небольшая программа для печати полномочий от 2 до 8. Но она не прекращается после 8. Пожалуйста, объясните причину.

#include <stdio.h>
#include <unistd.h>
int main(void)
{
        unsigned int i=1;
        while(1) {
                i = i<<1;
                printf("i = %d\n",i);
                if(i==(2^8))
                        break;
                sleep(1);
        }
        printf("Exited While loop.. \n");
        return 0;
}

Петля не выходит, когда я = 2 ^ 8. Мой вывод выглядит примерно так:

i = 2
i = 4
i = 8
i = 16
i = 32
i = 64
i = 128
i = 256
i = 512 (Should have Exited here. But the program is continuing. Why?)
i = 1024
i = 2048
i = 4096....

EDIT:

Спасибо за ответ, что ^ - оператор XOR. Но теперь приведенный ниже код ведет себя странно. Объясните.

#include <stdio.h>
int main(void)
{
        if((2)^8 == 1<<8) {
                printf("True.. \n");
        } else {
                printf("False..!!");
        }
        return 0;
}

Вышеуказанная программа функций печатает true.

4b9b3361

Ответ 1

В C оператор ^ означает XOR (побитовое исключение или).

Чтобы получить 2 от мощности 8, вам нужно либо использовать цикл (res * = 2 в цикле), либо закруглить функцию pow в math.h(обратите внимание, что функция math.h возвращает float - и поэтому не будет равно целому числу).

Самый простой способ - побитовый сдвиг, конечно.

О разделе редактирования:

Добро пожаловать в удивительный мир приоритета оператора. Что происходит, так это то, что == имеет более высокий приоритет, чем ^, и поэтому условное оценивает 2 ^ 0, что равно 2, что верно.

Чтобы заставить его работать, вам нужно добавить круглые скобки:

if ( (2^8) == (1<<8) ) ...

Ответ 2

Проблема заключается в том, что ^ является оператором Побитовым XOR, а не поднимается к власти. Объясните 2^8 в побитом формате:

2 = 0010
8 = 1000
======== xor
10= 1010

поэтому результат, использующий xor по-бит, равен 10, что никогда не происходит, поэтому ваш цикл никогда не выходит. Вы можете сделать свой unit test работающим, если вы используете pow(2,8) и округлите его до целого числа.

Другая информация, вероятно, не так в этом примере, но лучше избегать строгого равенства при работе с значениями с плавающей запятой, лучше сравнить с epsilon.

Для вашего редактирования: Обеспечьте приоритет следующим образом:

if((2^8) == (1<<8))

это вернет false, как и ожидалось.

Ответ 3

2^8 2 XOR 8, т.е. 10, а не 256. Следовательно, ваша петля не останавливается. Вероятно, вы захотите проверить либо (1<<8), либо конкретно 256.

Ответ 4

^ не является степенью в c, это означает XOR. 2 ^ 8 == 10, и он не будет равен я в этом коде.

Ответ 5

^ побитовое XOR, функция, которую вы ищете, равна pow в math.h:)

Ответ 6

Для раздела редактирования

#include <stdio.h>
int main()
{
        if((2^8) == (1<<8)) {
                printf("True.. \n");
        } else {
                printf("False..!!");
        }
        return 0;
}

Он вернет False.