Проблема в си с битовыми операциями
подскажите пожалуйста как с помощью битовых операций в си можно записать условие c == 0
Ответы (3 шт):
Условие c == 0 означает НЕ (с != 0).
Любое ненуклевое выражение при преобразовании в bool дает true, нулевое - false. Так что ваше c само по себе если нулевое, дает false, если нет - true. Чтобы было наобоорот - надо просто изменить его на обратное - написать !c.
Чисто битовыми - можно, но сложно, потому что надо подобрать такую последовательность операций, которая из 0 сделает ненулевое число (это просто), а из ЛЮБОГО ненулевого - ноль.
// gcc -std=c11 -c -Wall -Wextra -Wpedantic uintis0.c
# include <stdbool.h>
# include <iso646.h>
# include <stddef.h>
bool uint_is0 ( unsigned int c ) {
// узнаём количество битов в типе unsigned int
size_t s = sizeof ( unsigned int ) * 8U ;
do {
-- s ;
if ( c bitand 1U )
// если младший бит не ноль, тогда
// число точно не ноль
return false ;
// переходим на следующий бит
c >>= 1U ;
// пока биты не закончаться
} while ( s ) ;
return true ; }
или просто без битов если можно :
return ! c ;
bool isZero(int x) {
int val = 0;
for (int i = 0; i < sizeof(x) * 8; i++) {
val |= x & 1;
x >>= 1;
}
return !val & 1;
}
Если в x есть хоть один ненулевой бит, то после цикла val будет равно 1, иначе 0. Потом инвертируем все биты у val и берем последний