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ます。これは、汎整数拡張を実行するためです。ただし、上記の簡単な例では、この事実を無視します。)~maskmask~
正式な定義は次のとおりです。
[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ます。
(そしてそれは「チルダ」と呼ばれます。)