[comment utiliser ~ opérateur]
J'ai une structure dire Alpha
. Je connais la valeur de l'élément dans Alpha
(disons a
) qui peut être 0
ou 1
- Je souhaite que l'autre élément de la même structure prenne la valeur inverse de Alpha.a Par exemple:
if Alpha.a = 1
then Alpha.b = 0
et vice versa
J'ai essayé:
Alpha.b = ~ (Alpha.a)
Mais malheureusement, cela ne fonctionne pas - lorsque Alpha.a
est 1
, Alpha.b
est défini sur 254
Des idées?
Merci et salutations,
SamPrat
Utilisez l'opérateur XOR:
Alpha.b = Alpha.a ^ 1;
En C, true
est représenté par 1 et false
par 0. Toutefois, dans une comparaison, toute valeur non fausse est traitée comme vraie.
L'opérateur !
fait boolean inversion, donc! 0 est 1 et! 1 est 0.
Cependant, l'opérateur ~
fait bitwise inversion, où chaque bit de la valeur est remplacé par son inverse. Donc ~ 0 est 0xffffffff (-1). ~ 1 est 0xfffffffe (-2). (Et -1 et -2 sont considérés comme vrais, ce qui est probablement ce qui vous trouble.)
Ce que vous voulez, c'est !
au lieu de ~
.
L'opérateur ~
annule chaque bit. Par exemple, supposons que Alpha.a
est un unsigned char
. Alors ~1
se lirait en binaire, comme étant ~ 00000001, et le résultat serait 11111110 (encore une fois, en binaire), ce qui équivaut à 254 en décimal et à 0xFE en hexadécimal.
Comme d'autres l'ont suggéré, utilisez !Alpha.a
ou Alpha.a ^ 1
.
Une belle solution multi-langage multi-plateformes à ce problème commun est:
Alpha.b = 1 - Alpha.a;
Qu'en est-il d'un masque de bits postopératoire?
en utilisant des caractères non signés recherchant bit0:
b = 0x01u & ( ~a );
ou même
b = a ^ 0x01u;
ou pour "penseurs booléens" (sachez que VRAI et FAUX peuvent différer de 0/1! si vous le voulez "réel", vous devez utiliser VRAI et FAUX si défini)
b = (1 != a)?(0u):(1u);
À votre santé
Vous ne pouvez pas utiliser ~
car cela transforme 00000000
en 11111111
plutôt que 00000001
comme je le pense, ce à quoi vous vous attendez.
Si vous avez des bols, vous pouvez utiliser:
Alpha.b = !(Alpha.a)
mais sinon, vous devrez peut-être utiliser la logique if/else:
if (Alpha.a == 0)
{
Alpha.b = 1;
}
else
{
Alpha.b = 0;
}
Vous voulez utiliser un autre opérateur. Plus précisément !
Alpha.b = !Alpha.a
Puisque les valeurs sont zéro ou un, c'est beaucoup plus simple.