web-dev-qa-db-ja.com

〜Trueが-2になるのはなぜですか?

Python console:

~True

私に与えます:

-2

どうして?誰かがこの特定のケースをバイナリで説明できますか?

131
lukaszkups

int(True)1

1は:

00000001

および~1は:

11111110

-2 in 2の補数1

1 すべてのビットを反転し、結果の数値に1を加算し、結果を大きさのバイナリ表現として解釈し、負の符号を追加します(数値が始まるため) 1)と:

11111110 → 00000001 → 00000010 
         ↑          ↑ 
       Flip       Add 1

これは2ですが、 [〜#〜] msb [〜#〜] は1であるため、符号は負です。


言及する価値があります:

boolを考えてみてください。それは本質的に数値であることがわかります-TrueFalseの2つの値があり、整数の「カスタマイズされた」バージョンです1および0は、異なる方法でのみ印刷されます。これらは、整数型intサブクラスです。

そのため、boolstrreprを再定義して異なる表示を行うことを除いて、1と0として正確に動作します。

>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True

>>> True == 1
True
>>> True is 1  # they're still different objects
False
237
Maroun

Python boolタイプはintのサブクラスです(歴史的な理由により、ブール値はPython 2.3)でのみ追加されました) 。

int(True)1であるため、~True~1-2です。

boolintのサブクラスである理由については、 PEP 285 を参照してください。

ブール逆関数が必要な場合は、notを使用します。

>>> not True
False
>>> not False
True

~1-2である理由を知りたい場合は、符号付き整数のすべてのビットを反転しているためです。 000000011111110になります。これはsigned整数では負の数です。 2の補数 を参照してください。

>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'

ここで、最初の1ビットは値が負であることを意味し、残りのビットは正の数から1を引いたものの逆数をエンコードします。

44
Martijn Pieters

~True == -2 isif ifTrue1and~bitwise inversion...を意味します.

...ただし、

  • Trueは整数として扱うことができ、
  • 整数は 2の補数 で表されます

編集:

  • 整数表現とビットごとの反転演算子の混合を修正
  • 別の研磨を適用しました(メッセージが短いほど、より多くの作業が必要です)
4
Wolf