web-dev-qa-db-fra.com

comment utiliser l'inverse en C

[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

17
samprat

Utilisez l'opérateur XOR:

Alpha.b = Alpha.a ^ 1;
28
Prince John Wesley

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 ~.

40
David Given

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.

3
Lindydancer

Une belle solution multi-langage multi-plateformes à ce problème commun est:

Alpha.b = 1 - Alpha.a;
3
Bruce Ricker

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é

1
Thorben

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;
}
1
Chris Snowden

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.

0
Seth Robertson