파이썬 콘솔에서 :
~True
나에게 준다 :
-2
왜? 누군가이 특정 사례를 바이너리로 설명 할 수 있습니까?
답변
int(True)
입니다 1
.
1
입니다 :
00000001
그리고 ~1
:
11111110
어떤 인 -2
에 2의 보수 (1)
1 모든 비트를 뒤집고 결과 숫자에 1을 더한 다음 결과를 크기 의 이진 표현 으로 해석하고 음수 부호를 추가합니다 (숫자가 1로 시작하므로).
11111110 → 00000001 → 00000010
↑ ↑
Flip Add 1
어느 것이 2이지만 MSB 가 1 이므로 부호가 음수 입니다.
언급 할 가치가있는 것 :
생각해 보시오. bool
그것은 자연스럽게 숫자라는 것을 알게 될 것입니다-그것은 두 개의 값을 가지고 True
있으며 False
, 그것들은 단지 다르게 인쇄되는 정수 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
답변
파이썬 bool
타입은 int
(역사적인 이유로 부울은 파이썬 2.3에서만 추가 된) 하위 클래스입니다 .
이후 int(True)
이며 1
, ~True
이다 ~1
입니다 -2
.
왜 하위 클래스가 PEP 285 를 참조하십시오 .bool
int
부울 역을 원하면 다음을 사용하십시오 not
.
>>> not True
False
>>> not False
True
이유 ~1
가 무엇인지 알고 싶다면 -2
부호있는 정수로 모든 비트를 반전시키기 때문입니다. 부호있는 정수에서 음수 00000001
가 1111110
되는 것이됩니다 .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
비트 반전을 의미 하고 의미 한다면 놀라운 것은 아닙니다 …True
1
~
… 것을 제공
True
정수로 취급 될 수 있고- 정수는 2의 보수 로 표시됩니다
편집 :
- 정수 표현과 비트 반전 연산자의 혼합을 수정했습니다.
- 다른 연마 적용 (메시지가 짧을수록 더 많은 작업이 필요함)