Условная проверка для "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.
Ответы
Ответ 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.