Cの整数のすべてのビットに対して実行でき、1または0を返すビット演算または論理演算はありますか?
元。0b10101010 を含む整数は 1 を返し、0b00000000 は 0 を返します。
Cの整数のすべてのビットに対して実行でき、1または0を返すビット演算または論理演算はありますか?
元。0b10101010 を含む整数は 1 を返し、0b00000000 は 0 を返します。
単語のすべてのビットを論理積した場合、「すべてが 1」の結果のみが 1 になります。この例では、0b10101010 は 1 ではなく 0 を生成します。
代わりに、すべてのビットを OR した場合、ゼロ以外の値はすべて 1 になります。
したがって、以下は、2 の補数を想定せずに、任意の整数型に対してタイプ セーフになります。
int i = somevalue;
int and_bits = ~i == 0 ;
int or_bits = i != 0 ;
またはおそらくより直感的に:
int and_bits = i == ~0 ;
最初に書かれた質問は自己矛盾しており、AND について質問していますが、OR を示す例を使用しています。
数値内のすべてのビットの AND は、任意の 0 ビットを含むすべての値に対して 0 になり、すべてのビットが 1 の特定の値に対してのみ 1 になります。
(i==-1)
これは、任意の符号付き整数と同じように記述できますi
。符号なし整数の場合、テストは、((~i)==0)
より多くの型修飾が適用されたものとして、または同様のものとして記述したほうがよいでしょう。
数値のすべてのビットの OR は、特殊な 0 の場合のみ 0 になり、すべての非ゼロの場合は 1 になります。!!i
これは、任意の integerと同じように記述できますi
。
これが機能するのは、!
演算子 (C のすべての論理演算子と同様) が通常の方法で論理的真偽をテストし、必要に応じて値 0 または 1 のみを返すように指定されているためです。これ!!
は、任意の C 式を真の場合は 1 に、偽の場合は 0 に変換するための便利なイディオムです。
(更新:符号付き整数をオーバーフローする式によって潜在的に引き起こされる未定義の動作を回避するために言い直されましたi+1
。道徳: 符号付き整数に対してビット単位の演算を実行しないでください。符号付き整数は 2 の補数である必要はないため、-1 は実際にはすべてのビットが設定された単語で表されない場合があります。)
AND すべてのビット:
i==-1
またはすべてのビット:
i!=0
あなたが持っていると仮定しますint i
あなたが望むと思われる値は
`i != 0`
これはすべてのビットを「OR」します。
そしてMSNの回答の後、私は訂正されます。 i == -1
2 の補数を仮定して、ビットの AND を行います
与えられた例では、変数が 0 に等しいかどうかを簡単に確認できます。整数に 0 以外のビットがある場合、整数の値は 0 より大きくなります。実際には:
if (i != 0) {
//Some bits are 1.
} else {
// All bits are 0
}
または、C は整数をブール値に自動的にキャストするため、次のようになります。
if (i) {
...
比較から 0 または 1 の値を本当に取得したい場合は、より自動化された型キャストを利用してブール値を整数に戻すことができます。
int j = i != 0;