web-dev-qa-db-fra.com

Vérifier si le bit n'est pas activé

Si j'utilise ceci: if(value & 4) pour vérifier si le bit est défini, comment puis-je vérifier si le bit n'est pas défini?

J'ai essayé avec if(!value & 4) ou if(~value & 4) et if(value ^ 4) mais aucun d'entre eux ne fonctionne.

7
Protogrammer

Lorsque vous écrivez if(value & 4), C vérifie que le résultat est différent de zéro. Essentiellement, cela signifie

if((value & 4) != 0) {
    ...
}

Par conséquent, si vous souhaitez vérifier que le bit est pas set, comparez le résultat pour l'égalité à zéro:

if((value & 4) == 0) {
    ...
}
19
dasblinkenlight

Vous pouvez le faire de plusieurs façons, mais la plus simple (la plus facile, nécessitant le moins de réflexion) serait tout simplement de nier toute l'expression que vous avez déjà:

if (!(value & 4))
6
Kevin DiTraglia

Simplement:

if ((value & 4) == 0)

Pourquoi?

Si value est 01110011

Ensuite

01110011
&
00000100
--------

Renverra 0 car le 4ème bit est désactivé.

4
Maroun

la ligne de hastebin est mal écrite, a un code inaccessible et dépend fortement de la préséance des opérateurs C. Et ne fonctionne pas comme prévu.

La ligne de hastebin:

if( cur_w > source.xpos + source.width
&&
!(source.attributes & DBOX_HAS_SHADOW) )
{
    break;
    return; 
}

il devrait être écrit comme:

if( (cur_w > (source.xpos + source.width))  // has curr_w exceeded sum of two other fields?
    &&
    ((source.attributes & DBOX_HAS_SHADOW) != DBOX_HAS_SHADOW ) //is bit == 0?
{
    break;
}
0
user3629249