development

왜 ~ True가 -2가됩니까?

big-blog 2020. 6. 30. 08:00
반응형

왜 ~ True가 -2가됩니까?


파이썬 콘솔에서 :

~True

나에게 준다 :

-2

왜? 누군가이 특정 사례를 바이너리로 설명 할 수 있습니까?


int(True)입니다 1.

1 입니다 :

00000001

그리고 ~1:

11111110

어떤 인 -22의 보수 (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참조하십시오 .boolint

부울 역을 원하면 다음을 사용하십시오 not.

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

이유 ~1무엇인지 알고 싶다면 -2부호있는 정수로 모든 비트를 반전시키기 때문입니다. 부호있는 정수에서 음수 000000011111110되는 것이됩니다 .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비트 반전을 의미 하고 의미 한다면 놀라운 것은 아닙니다 ...True1 ~

... 것을 제공

  • True 정수로 취급 될 수 있고
  • 정수는 2의 보수 로 표시됩니다

편집 :

  • 정수 표현과 비트 반전 연산자의 혼합을 수정했습니다.
  • applied another polishing (the shorter the message, the more work needed)

참고URL : https://stackoverflow.com/questions/21881362/why-does-true-result-in-2

반응형