Python console:
~True
私に与えます:
-2
どうして?誰かがこの特定のケースをバイナリで説明できますか?
int(True)
は1
。
1
は:
00000001
および~1
は:
11111110
-2
in 2の補数1
1 すべてのビットを反転し、結果の数値に1を加算し、結果を大きさのバイナリ表現として解釈し、負の符号を追加します(数値が始まるため) 1)と:
11111110 → 00000001 → 00000010
↑ ↑
Flip Add 1
これは2ですが、 [〜#〜] msb [〜#〜] は1であるため、符号は負です。
言及する価値があります:
bool
を考えてみてください。それは本質的に数値であることがわかります-True
とFalse
の2つの値があり、整数の「カスタマイズされた」バージョンです1および0は、異なる方法でのみ印刷されます。これらは、整数型int
のサブクラスです。
そのため、bool
がstr
とrepr
を再定義して異なる表示を行うことを除いて、1と0として正確に動作します。
>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True
>>> True == 1
True
>>> True is 1 # they're still different objects
False
Python bool
タイプはint
のサブクラスです(歴史的な理由により、ブール値はPython 2.3)でのみ追加されました) 。
int(True)
は1
であるため、~True
は~1
は-2
です。
bool
がint
のサブクラスである理由については、 PEP 285 を参照してください。
ブール逆関数が必要な場合は、not
を使用します。
>>> not True
False
>>> not False
True
~1
が-2
である理由を知りたい場合は、符号付き整数のすべてのビットを反転しているためです。 00000001
は1111110
になります。これはsigned整数では負の数です。 2の補数 を参照してください。
>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'
ここで、最初の1
ビットは値が負であることを意味し、残りのビットは正の数から1を引いたものの逆数をエンコードします。
~True == -2
isif ifTrue
は1
and~
はbitwise inversion...を意味します.
...ただし、
True
は整数として扱うことができ、編集: