Проблема в си с битовыми операциями

подскажите пожалуйста как с помощью битовых операций в си можно записать условие c == 0


Ответы (3 шт):

Автор решения: Mikhailo

Условие c == 0 означает НЕ (с != 0).

Любое ненуклевое выражение при преобразовании в bool дает true, нулевое - false. Так что ваше c само по себе если нулевое, дает false, если нет - true. Чтобы было наобоорот - надо просто изменить его на обратное - написать !c.

Чисто битовыми - можно, но сложно, потому что надо подобрать такую последовательность операций, которая из 0 сделает ненулевое число (это просто), а из ЛЮБОГО ненулевого - ноль.

→ Ссылка
Автор решения: AlexGlebe
// 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 ; 
→ Ссылка
Автор решения: Anton Shchyrov
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 и берем последний

→ Ссылка