0
if (~mask == 0){...}

.cpp ファイルの 1 つでこの問題に遭遇しましたが、c/c++ で ~ はどういう意味ですか?

4

5 に答える 5

8

これはチルダであり、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を混同しないでください。デストラクタに選ばれたのは興味深いことです。おそらくそれは、デストラクタをコンストラクタの反対(つまり論理否定)として認識できるためです。~

于 2013-02-08T17:42:41.780 に答える
4

少し賢明ではありません。変数のすべてのビットを反転します。この場合、「マスク」のすべてのビットが1であれば、ifはtrueになります。

于 2013-02-08T17:42:59.177 に答える
1

これは、Cではビット単位の補数演算子と呼ばれます。

(プロモートされた)オペランドのすべてのビットを反転します(a0はa1になり、aはaに1なります0)。

if (~mask == 0){...}

maskこれにより、のすべてのビットがに設定されているかどうかがチェックされ1ます。

于 2013-02-08T17:44:03.667 に答える
0

少し賢明な操作ではありません。

(そしてそれは「チルダ」と呼ばれます。)

于 2013-02-08T17:43:41.860 に答える