web-dev-qa-db-ja.com

Cでインバースを使用する方法

[〜演算子の使い方]

Alphaという構造があります。 Alphaaなど)内の要素の値は0または1になります。同じ構造の他の要素にAlpha.aの逆の値を取得させます。例えば:

if Alpha.a = 1
then Alpha.b = 0

およびその逆

私が試してみました:

Alpha.b = ~ (Alpha.a)

しかし、残念ながら機能しません-Alpha.a1の場合、Alpha.b254に設定されます

何か案は?

よろしくお願いします、

サムプラット

19
samprat

XOR演算子を使用:

Alpha.b = Alpha.a ^ 1;
32

Cでは、trueは1で表され、falseは0で表されます。ただし、比較では、偽以外の値はすべてtrueとして扱われます。

!演算子はboolean反転を行うため、!0は1で、!1は0です。

~演算子は、しかし、bitwise inversionを行います。この場合、値のすべてのビットがその逆に置き換えられます。したがって、〜0は0xffffffff(-1)です。 〜1は0xfffffffe(-2)です。 (そして、-1と-2の両方が真であると考えられ、それはおそらくあなたを混乱させるものです。)

欲しいのは!、 の代わりに ~

40
David Given

~演算子は、個々のビットを否定します。たとえば、Alpha.aunsigned char。その後、~1は、バイナリで〜00000001を読み取り、結果は11111110(再びバイナリで)になります。これは、10進数で254、16進数で0xFEと同じです。

他の人が示唆しているように、!Alpha.aまたはAlpha.a ^ 1

3
Lindydancer

この一般的な問題に対する素晴らしいクロスプラットフォームのクロス言語ソリューションは次のとおりです。

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

操作後のビットマスクはどうですか?

bit0を探して符号なし文字を使用する:

b = 0x01u & ( ~a );

あるいは

b = a ^ 0x01u;

または、「ブール演算式」の場合(TRUEとFALSEが0/1と異なる場合があることに注意してください!「真のブール値」が必要な場合は、TRUEとFALSEを定義する必要があります。)

b = (1 != a)?(0u):(1u);

乾杯

1
Thorben

~は、00000000ではなく1111111100000001に変換するため、使用できません。

ブールがある場合は、次を使用できます。

Alpha.b = !(Alpha.a)

しかし、そうでない場合は、if/elseロジックを使用する必要があります。

if (Alpha.a == 0)
{
    Alpha.b = 1;
}
else
{
    Alpha.b = 0;
}
1
Chris Snowden

別の演算子を使用します。特に!

Alpha.b = !Alpha.a

値は0または1であるため、はるかに単純です。

0
Seth Robertson