왜 ~ 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

어떤 인 -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

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단일 값으로 정의 됩니다. 모든하지되는 truefalse. 내가 아는 모든 프로그래밍 언어는 머리에 형식 논리를 설정 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부호있는 정수로 모든 비트를 반전시키기 때문입니다. 부호있는 정수에서 음수 000000011111110되는 것이됩니다 .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.