if (~mask == 0){...}
.cpp ファイルの 1 つでこの問題に遭遇しましたが、c/c++ で ~ はどういう意味ですか?
これはチルダであり、C++ではビット単位ではないことを意味します。
次のビット表現で名前が付けられた8ビットの符号なし整数の場合mask
:
0010 1100
の値~mask
は次のとおりです。
1101 0011
すべてのビットが反転していることに注目してください。
if
条件( )がtrueと~mask == 0
評価される場合:
~mask: 0000 0000
mask: 1111 1111
このような場合、mask
は値を持ちます255
。
必要に応じて、ビット幅と符号が異なる整数に同じロジックを適用します。
(注:実際には、システムに32ビットがある場合、8ビットであっても32ビットになりint
ます。これは、汎整数拡張を実行するためです。ただし、上記の簡単な例では、この事実を無視します。)~mask
mask
~
正式な定義は次のとおりです。
[C++11: 5.3.1/10]:
のオペランドは、˜
整数型またはスコープなしの列挙型でなければなりません。結果は、そのオペランドの1の補数です。統合プロモーションが実行されます。結果のタイプは、プロモートされたオペランドのタイプです。単項式 にはあいまいさがあります。˜X()
ここX
で、はクラス名またはdecltype-specifierです。あいまいさは、デストラクタを指すものとして˜
扱うのではなく、単項補数として扱うことを優先して解決されます。˜X
パッセージが思い出させるように、クラスデストラクタの名前の主役とビット単位でNOTを混同しないでください。デストラクタに選ばれたのは興味深いことです。おそらくそれは、デストラクタをコンストラクタの反対(つまり論理否定)として認識できるためです。~
少し賢明ではありません。変数のすべてのビットを反転します。この場合、「マスク」のすべてのビットが1であれば、ifはtrueになります。
これは、Cではビット単位の補数演算子と呼ばれます。
(プロモートされた)オペランドのすべてのビットを反転します(a0
はa1
になり、aはaに1
なります0
)。
if (~mask == 0){...}
mask
これにより、のすべてのビットがに設定されているかどうかがチェックされ1
ます。
(そしてそれは「チルダ」と呼ばれます。)