인프런 커뮤니티 질문&답변

이승철님의 프로필 이미지
이승철

작성한 질문수

Python 부트캠프

생선을 잡아라 - 멤버 연산과 식별 연산, 연산자 우선순위

비트연산자 2의 보수

작성

·

808

1

2의 보수에 대한 설명에서

비트를 뒤집고 1을 더한 값을 기존의 수와 더하고 올림수를 버리면 0이 나온다는 것은 이해가 됐는데

설명과 ~ 연산자로 나온 값이랑의 관계성을 모르겠어요

a= 40이면 ~a = -41 이니 0b101000, -0b101001 이 2의 보수 관계인 것이 이해가 안되네요

답변 3

1

이승철님의 프로필 이미지
이승철
질문자

-0b101001 이 실제로 표현을 하면 11011000으로 되어 있는 건가요?

아니면 ~a가 11011000으로 되어 있는 건가요?ㅜㅜ

너무 깊은 내용이면 깊은물까지 듣고 나서 다시 질문할게요

1

Hojun Lee님의 프로필 이미지
Hojun Lee
지식공유자

안녕하세요 승철님! :) 맞습니다. 그 관계로 이해가 안가시는 것이 맞아요.

이렇게 나오셔서 대 혼란이 있으셨죠?ㅜㅜ

python document(https://docs.python.org/3/reference/expressions.html?highlight=bitwise%20inversion) 를 보시면 '~'의 동작에 대해 아래와 같이 설명하고 있습니다.

The unary ~ (invert) operator yields the bitwise inversion of its integer argument. The bitwise inversion of x is defined as -(x+1). It only applies to integral numbers.

그래서 코드 상의 결과물로는 단순히 마이너스 부호로만 붙이는 것으로 끝나죠. 그런데, 보시면 아시겠지만 bit가 6개잖아요? 그럼 2개의 비트는 어디에 있는 것일까요? 아래 코드를 실행시켜 보시면 실제 컴퓨터에 저장되는 '실제 값'을 볼 수 있습니다.

코드도 남겨드립니다.

(-1).to_bytes(1, byteorder='little', signed = True), (-2).to_bytes(1, byteorder='little', signed = True)

위에 출력되는 값은 파이썬에서 '표현하는 양식'일 뿐이고, 실제 저장되는 바이트의 단위는 위와 같습니다.

\x뒤에 ff값은 11111111을 나타내고요.

fe는 11111110을 나타냅니다.

이제 2의 보수값이 (우리가 예상하고 원하는 값으로) 제대로 나오고 있죠.

표현식에서 반전을 하려면 xor를 하셔야 합니다.

얕은 물에서는 가볍게 훑고 넘어가시는 것이 좋습니다.ㅜㅜ

질문해주신 김에, 깊은 물에서 bit 연산을 좀 더 깊게 다뤄보는 챕터를 찍어놓을게요.

감사합니다.^^

0

Hojun Lee님의 프로필 이미지
Hojun Lee
지식공유자

넵! 말씀해주신 사항이 맞아요.

깊은 물 강의에 승철님이 질문해주신 내용을 '추가챕터'로 설명해 놓도록 하겠습니다.

감사합니다. 

이승철님의 프로필 이미지
이승철

작성한 질문수

질문하기