[〜演算子の使い方]
Alpha
という構造があります。 Alpha
(a
など)内の要素の値は0
または1
になります。同じ構造の他の要素にAlpha.aの逆の値を取得させます。例えば:
if Alpha.a = 1
then Alpha.b = 0
およびその逆
私が試してみました:
Alpha.b = ~ (Alpha.a)
しかし、残念ながら機能しません-Alpha.a
が1
の場合、Alpha.b
は254
に設定されます
何か案は?
よろしくお願いします、
サムプラット
XOR演算子を使用:
Alpha.b = Alpha.a ^ 1;
Cでは、true
は1で表され、false
は0で表されます。ただし、比較では、偽以外の値はすべてtrueとして扱われます。
!
演算子はboolean反転を行うため、!0は1で、!1は0です。
~
演算子は、しかし、bitwise inversionを行います。この場合、値のすべてのビットがその逆に置き換えられます。したがって、〜0は0xffffffff(-1)です。 〜1は0xfffffffe(-2)です。 (そして、-1と-2の両方が真であると考えられ、それはおそらくあなたを混乱させるものです。)
欲しいのは!
、 の代わりに ~
。
~
演算子は、個々のビットを否定します。たとえば、Alpha.a
はunsigned char
。その後、~1
は、バイナリで〜00000001を読み取り、結果は11111110(再びバイナリで)になります。これは、10進数で254、16進数で0xFEと同じです。
他の人が示唆しているように、!Alpha.a
またはAlpha.a ^ 1
。
この一般的な問題に対する素晴らしいクロスプラットフォームのクロス言語ソリューションは次のとおりです。
Alpha.b = 1 - Alpha.a;
操作後のビットマスクはどうですか?
bit0を探して符号なし文字を使用する:
b = 0x01u & ( ~a );
あるいは
b = a ^ 0x01u;
または、「ブール演算式」の場合(TRUEとFALSEが0/1と異なる場合があることに注意してください!「真のブール値」が必要な場合は、TRUEとFALSEを定義する必要があります。)
b = (1 != a)?(0u):(1u);
乾杯
~
は、00000000
ではなく11111111
を00000001
に変換するため、使用できません。
ブールがある場合は、次を使用できます。
Alpha.b = !(Alpha.a)
しかし、そうでない場合は、if/elseロジックを使用する必要があります。
if (Alpha.a == 0)
{
Alpha.b = 1;
}
else
{
Alpha.b = 0;
}
別の演算子を使用します。特に!
Alpha.b = !Alpha.a
値は0または1であるため、はるかに単純です。