왜 ~ True가 -2가됩니까?


132

파이썬 콘솔에서 :

~True

나에게 준다 :

-2

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


22
때문 ~1이다 -2, 시도 :True == 1
— Grijesh 차우에게

15
정확히 말해서 : " True is 1"는 사실이 아니지만 사실입니다 True == 1.
— Bach

3
UNARY_INVERT(바이트 코드 전체)를 보는 것이 답변에 아무것도 추가 할 것이라고 생각하십니까 ?
— Wooble

2
이 질문은 중복 되지 않습니다 ! 의 특정 동작에 대해 묻습니다 bool. ~작동 방식 이 아닙니다 . 실제로이 질문에 대한 올바른 대답은 2의 보수와 ~정수에서 어떻게 작동 하는지 언급하지 않아도 됩니다.
— Bakuriu

답변:


240

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

1
하지만 : @ofcapl 그냥 말을하고 싶었 int('1')도 1있지만, ~'1'반면 TypeError 예외 일 수 ~True있기 때문이다 아니다 bool의 하위 클래스 인 int마티는 그의 대답에이 정보를 추가 @가.
— Grijesh Chauhan

@ofcapl 레코드의 경우,이 답변은 실제 바이트 코드 (소스에서 컴파일 된 일종의 중간 또는 작업 레벨 코드 일 수 있음)가 아니라 진행 상황에 대한 이진 산술 해석을 보여줍니다 .
— Patrick M

5
@etrusco 무슨 언어를 사용하고 있습니까? 나는 정확히 0을 알고 있고 True == -1, 어디 에서 말할 수 있는지 많은 것을 알고 있습니다 True == 1.
— l4mpi

1
@etrusco @ l4mpi 일부 구식 BASIC -1은 TRUE에 사용 합니다. 그것은 비트 AND 및 OR 연산자가 논리 AND 및 OR에 대해서도 작동한다는 멋진 특성을 가지고 있습니다 ( C에서 0이 아닌 x & -1동일한 경우 x && 10이 아님). 단락을 신경 쓰지 않는 한 . 그러나 내가 아는 한, 주류 언어는 -1TRUE에 사용한 적이 없습니다 .
— Quuxplusone

1
형식 논리는 truth단일 값으로 정의 됩니다. 모든하지되는 true것 false. 내가 아는 모든 프로그래밍 언어는 머리에 형식 논리를 설정 false하여 단일 값 (0)으로 정의 하고 모두 거짓이 아닙니다 true. 예를 들어 C # 이지만 Javascript는 특이한 특성이지만 여러 가지 진실성 및 여러 가지 거짓 맛이 있습니다 .
— Nicholas Carey

45

파이썬 bool타입은 int(역사적인 이유로 부울은 파이썬 2.3에서만 추가 된) 하위 클래스입니다 .

이후 int(True)이며 1, ~True이다 ~1입니다 -2.

왜 하위 클래스가 PEP 285 를 참조하십시오 .boolint

부울 역을 원하면 다음을 사용하십시오 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을 뺀 값의 역을 인코딩합니다.


1
@GrijeshChauhan는 두 가지의 칭찬를 들어, 사용할 수 있습니다 struct.pack로, bin(integer)또는 format(integer, '08b')계정으로 로그인 정수를하지 않습니다.
— Martijn Pieters

@thefourtheye, MartijnPieters 내가 시도하지만 예를 혼란 bin(~True), bin(-2), bin(~1)모두 제공 '-0b10' 하면 -2표현이 10왜 -기호.
— Grijesh Chauhan

내 10자신의 의미 2 ' 보완 다음 -ve?
— Grijesh Chauhan

1
이 같은 부정적이고 긍정적 인 숫자를 모두의 2의 보수 표기를 얻을 수 있습니다 @GrijeshChauhanformat(-2 % (1 << 32), "032b")
— thefourtheye

2
@thefourtheye : 비트 마스크를 사용합니다 :format(-2 & ((1 << 32) - 1), "032b")
— Martijn Pieters

4

~True == -2비트 반전을 의미 하고 의미 한다면 놀라운 것은 아닙니다 ...True1 ~

... 것을 제공

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

편집 :

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

2
~"2s 보수"를 의미하지는 않습니다. ~"비트 단위 반전"을 의미
— McKay

1
"Ones '보수"라는 문구는 정수를 비트 단위로 저장하는 시스템을 의미하는 것처럼 실제로 연산을 의미하지 않습니다. 컴퓨터 시스템에서 실제로 사용되지 않는 시스템.
— McKay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.