programing

~True가 -2가 되는 이유는 무엇입니까?

stoneblock 2023. 8. 27. 08:51

~True가 -2가 되는 이유는 무엇입니까?

Python 콘솔의 경우:

~True

제공:

-2

왜죠? 누가 이진법으로 이 사건을 설명해줄 수 있나요?

int(True)이라1.

1다음과 같습니다.

00000001

그리고.~1다음과 같습니다.

11111110

어느 것이-2투의1 보충으로

1 모든 비트를 뒤집고 결과 숫자에 1을 추가한 후 결과를 크기의 이진 표현으로 해석하고 음수 기호를 추가합니다(숫자가 1로 시작하므로).

11111110 → 00000001 → 00000010 
         ↑          ↑ 
       Flip       Add 1

이 값은 2이지만 MSB가 1이므로 부호는 음수입니다.


언급할 가치가 있는 항목:

대해 생각하다bool당신은 그것이 본질적으로 숫자라는 것을 알게 될 것입니다 - 그것은 두 가지 값을 가지고 있습니다,True그리고.False그리고 그것들은 단지 다르게 인쇄하는 정수 1과 0의 "맞춤형" 버전일 뿐입니다.정수 유형의 하위 클래스입니다.int.

그래서 그들은 정확히 1과 0처럼 행동합니다, 그것을 제외하고는.bool재정의합니다.str그리고.repr다른 방식으로 표시할 수 있습니다.

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

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

파이썬booltype은 의 하위 클래스입니다.int(역사적인 이유로, 부울은 Python 2.3에서만 추가되었습니다.)

부터int(True)이라1,~True이라~1이라-2.

이유는 PEP 285를 참조하십시오.bool의 하위 클래스입니다.int.

부울 역수를 원했다면 다음을 사용합니다.not:

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

왜 그런지 알고 싶다면,~1이라-2부호 있는 정수의 모든 비트를 반전시키기 때문입니다.00000001된다1111110부호 있는 정수에서 음수인 경우, Two의 보어를 참조:

>>> # 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정수로 처리할 수 있습니다.
  • 정수는 Two의 보어로 표시됩니다.

편집:

  • 정수 표현과 비트 반전 연산자 간의 혼합을 수정했습니다.
  • 다른 연마 적용(메시지가 짧을수록 작업이 더 필요함)

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