2017-10-04 17 views
0

なぜbitwise notはトグルビットとして期待どおりに機能しませんか?以下の例を参照してください:PythonのBit-wise NOTの意味

a = 5 
print(bin(a)) 
b = ~a 
print(bin(b)) 

これが出力されます:

0b101 
-0b110 

左からの最初のビットがトグルされていない理由の質問はありますか?

Pythonドキュメントが言うことを考える:

を〜xは、xの補数を返します - あなたは1


0とそれぞれ0各 1を切り替えて取得数を

編集: "〜"は単純なビットのトグルの演算子ではなく、代わりに2の補数の演算子ですか? もしそうなら、なぜドキュメントから引用された文がそれを伝えていないのですか?上記のPythtonの文書の文章は、私にこれを意味するものではありません。

+0

を参照してくださいので、2の補数 –

+0

ノートのそれ '-' -0b110''の前に、'0b110'されています。無限の一連の '1 'が左に後ろにあることを示すことはできないので、' bin(abs(b)) 'の前に' - '記号を表示しています。 – user2357112

+0

プリアンブル - https://wiki.python.org/moin/BitwiseOperators –

答えて

4

は、すべてのビットをトグルしてです。 先行ゼロの無数を含むそれらのすべて、主要なものの無数の製造:Pythonはない3ビットまたは32ビットまたは64ビット、無限のビット表現をシミュレートするため

0b...111111111111111111111111111111111111111111111111111010 

をまたは任意の有限数。

Pythonでは先行する数字が無限に表示されないため、bin(abs(b))の前に-と表示されます。 abs(b)6bin(6)あなたが

-0b110 
+0

これは本当に良い答えです。あなたはどこで情報を入手しましたか? – lmiguelvargasf

+0

@lmiguelvargasf:私が読んだことはすべて覚えていませんが、私のソースの少なくとも1つは、おそらく[Pythonデータモデルのドキュメント](https://docs.python.org/3/reference/datamodel.html)でした。 "シフトとマスク操作のために、2進表現が仮定され、負の数は2の補数の変形で表現され、符号ビットの無限のストリングの錯覚を与える左に伸びている。 – user2357112