7

ビット単位の演算子(、など)を使用して、&サイズ|の異なる2つのビットフィールドを比較するとどうなりますか?

たとえば、:と比較0 1 1 00 0 1 0 0 0 0 1ます。

0 1 1 0 0 0 0 0 The smaller one is extended with zeros and pushed to the
0 0 1 0 0 0 0 1 most-significant side.

または...

0 0 0 0 0 1 1 0 The smaller one is extended with zeros and pushed to the
0 0 1 0 0 0 0 1 least-significant side.

または...

0 1 1 0 The longer one is truncated from its least-significant side,
0 0 1 0 keeping its most significant side.

または...

0 1 1 0 The longer one is truncated from its most-significant side,
0 0 0 1 keeping its least-significant side.
4

3 に答える 3

7

ビット単位の演算子は、昇格されたオペランドに対して常に機能します。そのため、正確に何が起こるかは、一方 (または両方) のビットフィールドが署名されているかどうかによって異なります (符号拡張が発生する可能性があるため)。

したがって、値の例では、バイナリ値のビットフィールド0 1 1 0は に昇格されint 6、バイナリ値のビットフィールド0 0 1 0 0 0 0 1は に昇格されint 33ます。これらは、演算が何であれ使用されるオペランドです。 .

于 2011-06-09T16:49:49.220 に答える
2

実際に値をビットフィールドとして使用している場合、異なるサイズのビットフィールドを比較することの意味は何ですか?それはあなたにとって意味のある結果を生み出しますか?

とはいえ、両方のオペランドは、元のオペランドの符号に応じて、符号付きのint/の最小サイズにプロモートされます。unsigned次に、これらの昇格された値がビット演算子と比較されます。

これは2番目の例として動作します。小さい方はMSB側でゼロが埋め込まれます(必要に応じてLSB側にプッシュされます)。

一方のオペランドが符号付きで負で、もう一方が符号なしの場合、負のオペランドはビット演算が行われる前に合同な符号なし数値に変換されます。

整数の代わりに、std::bitsetサイズの異なるビットセットに対してビット単位の演算を実行できない場合。

于 2011-06-09T17:47:03.437 に答える
2

0 0 0 0 0 1 1 0 小さい方はゼロで拡張され、0 0 1 0 0 0 0 1 最下位側にプッシュされます。

于 2011-06-09T17:03:35.500 に答える