주인장의 프로그래밍 개발 공부방

[Chapter 2 연산자] 5. 비트 연산자 - 비트전환 연산자 본문

프로그래밍 기본 지식/Chapter 2 연산자

[Chapter 2 연산자] 5. 비트 연산자 - 비트전환 연산자

거신 2019. 5. 20. 21:39

지난 시간에는 단항 연산자 중 부호 연산자와 논리부정 연산자에 대해서 알아보았다.

이번 시간에는 단항 연산자 중 비트전환 연산자에 대해서 한 번 알아보자.

 

목표 : 비트전환 연산자의 의미를 이해하고 2의 보수로 치환하는 방법을 습득한다.

 

1. 비트전환 연산자

 

이번에도 처음부터 요상한 이름의 녀석이 등장했다.

우리가 앞서 논리부정 연산자와 같이 이번에도 이름을 분리해서 추측을 해보자.

비트 / 전환 / 연산자라고 나눌 수 있겠는데

이번에는 비트라고 되어 있는걸보니 아마 비트, 즉, 2진수를 가지고 뭔가를 하는 녀석인거 같다.

 

비트전환 연산자

정수를 2진수로 표현했을 때, 1은 0으로, 0은 1로 바꾸는 연산자이다.

방금 정수를 2진수로 바꾼다고 했는데 정수형에만 사용가능한 연산자가 되겠다.

굳이 강조를 한 이유가 있었던 것이다.

 

얼핏보면 정말 간단해 보이지만

정말 간단하다.

이렇게 비트의 0은 1로, 1을 0으로 바꾸는 것을 1의 보수라고 한다.

다시 말해, 비트전환 연산자는 1의 보수로 바꿔주는 연산자라고 할 수 있겠다.

 

간단하게 한 번 해보자.

 

정수형 10진수 10을 가지고 바꿔볼텐데

10진수의 10을 2진수로 바꾸면

 

1 0 1 0 (2)

*(2)는 2진수라는 표시

 

가 될 것이다.

 

그러면 ~를 이용해서 1의 보수로 바꾸면

당연하게도

 

0 1 0 1 (2)

*(2)는 2진수라는 표시

 

이 될 것이다.

너무나도 간단하다.

 

그런데 이렇게 간단한 거라면 정말 좋겠지만

그렇지가 못하다는게 사람 인생이 아니겠는가.

 

2. 1의 보수의 결과?

 

사실 비트전환 연산자, 1의 보수가 등장한 이유가 있다.

바로 -(음수)를 컴퓨터에서 표현하기 위해서다.

아니 뜬금없이 이상한 소리를 하는가 싶겠지만

컴퓨터는 거짓말 같겠지만 음수를 표현할 수가 없다.

그러면 모니터에 뜨는 음수들은 뭐냐라고 묻고 싶겠지만

음수인 것 처럼 보여주는 것이고 실제로 컴퓨터에는 음수라는 숫자는 존재하지 않는다.

애초에 0과 1로만 구성되어 있는데 '-'라는 것이 있을리가.....

 

그렇다면 어떻게 컴퓨터가 음수를 처리할 수 있는가에 대한 의문점이 생길 것이다.

아니 생겨야 우리가 이걸 배우고 있는 의미가 있을 것이다.

원론적으로 컴퓨터는 가산, 즉, 덧셈만 가능하다.

그렇기 때문에 감산, 뺄셈을 해야하는 음수의 표현은 불가능한 것이다.

그러면 도대체 컴퓨터는 어떻게 음수를 표현하고 뺄셈을 할 수 있는 것일까?

 

그래서 등장한 것이 바로 비트전환 연산자, 1의 보수라는 녀석이다.

1의 보수는 단순히 0을 1로, 1을 0으로 바꾸는 것이 전부가 아니라

10진수의 (양수)정수를 음수로 바꿔주는 역할을 하는 것이다.

 

앞서 예를 들었던 10진수 10을 1의 보수로 취한 값

0 1 0 1(2)라고 했다.

그런데 지금 우리가 알고 있는 지식으로 보면

0 1 0 1(2)는 10진수로 표현하면 5가 되어야 한다.

그런데 작성자가 앞서 설명했던 음수는 도대체 어디로 날아간 것인가?

작성자가 당신들을 속이고 있는 것인가?

깜짝 몰카였단 말인가? 그렇단 말인가?

 

여기에서 비트라는 것을 조금만 더 확장해서 생각해보자.

앞서 예시를 들었던 것은 4bit로 표현한 것이다.

그런데 예전에 변수를 알아보면서 byte타입이 표현할 수 있는 숫자의 범위 등을 알아봤었다.

byte의 크기는 1byte, 즉, 8비트인데

비트의 맨 앞 비트 부호비트(MSB) 부호를 결정하는 비트라고 설명을 했었다.

(기억하고 있다면 알고 있겠지. 모르면 다시 변수 파트를 읽어보자.)

 

그렇기 때문에 우리는 4bit가 아니라 가장 작은 단위 byte인 1byte, 즉, 8bit를 기준으로 생각할 것이다.

다시 10진수 (양수)10을 가지고 예시를 들어보자.

8bit로 표현을 하면

 

0 0 0 0 1 0 1 0(2)

*(2)는 2진수라는 표시

 

로 표현할 수 있겠다.

앞에 남는 자리에 전부 0을 채우면 된다.

그리고 1의 보수로 바꾸면

 

1 1 1 1 0 1 0 1(2)

 

가 된다.

이렇게만 보면 이 2진수는 10진수로 바꾸면

128 + 64 + 32 + 16 + 4 + 1이 되니 245라고 읽을 것이다.

근데 이게 맞을까?

맞으면 작성자가 이렇게 손목을 부여잡으면서 이렇게 쓰지는 않았을 거 같은데....

 

3. 2의 보수란

 

방금 전에 비트에서 가장 앞에 있는 비트 부호비트(MSB)라고 했었다.

그렇기 때문에

 

1 1 1 1 0 1 0 1(2)

*(2)는 2진수라는 표시

 

에서 맨 앞에 있는 비트는 1이기 때문에 이 숫자는 음수라는걸 예상할 수 있다.

그렇다면 맨 앞 비트를 빼고 계산하면

64 + 32 + 16 + 4 + 1이 되니 앞에 음수를 붙여 -117이 되는거 아닌가 싶겠지만

이 또한 틀렸다.

 

예시의 2진수는 -11이 된다.

뭔가 싶을 거다.

 

 1의 보수를 뜯어보기 전에 우리들이 먼저 알아야 하는 것이 있다.

바로 2의 보수이다.

아니 1의 보수도 제대로 안했는데 무슨 2의 보수냐고

너는 보수단체 회원이냐고 묻고 싶겠지만

2의 보수를 알고 1의 보수를 알아보면 더 간단하기 때문에 일부러 언급하는 것이다.

 

2의 보수는 단 두 단어로 설명할 수 있다.

10진수의 음수형.

우리가 앞서 컴퓨터는 뺄셈을 못하기 때문에 음수를 표현할 수 없다고 했는데

바로 그 문제를 해결하기 위해서 2의 보수라는 것을 만들어냈다.

 

따라서 10진수 10의 2의 보수는 -10이 된다는 것이다.

그러면 2의 보수는 어떻게 만드는가 궁금할텐데

2의 보수는 간단하다.

1의 보수에서 더하기 1을 하면 된다.

 

그러면 앞서 1의 보수로 바꾼 2진수에 1을 더하면

 

1 1 1 1 0 1 1 0(2)

*(2)는 2진수라는 표시

 

이 된다.

이게 컴퓨터가 인식하는 -10이라는 숫자가 된다.

우리들, 사용자들이 봤을 때는 2의 보수로 바뀐 숫자는 알 수가 없다.

많이 공부하고 어느정도 머릿 속에서 그림이 그려지는 사람이라면

암산으로 바꾸고 답을 유추할 수 있겠지만

우리들은 아직까지 2의 보수만 읽어서 원래의 숫자와 음수표현된 숫자를 알기에는 힘들다.

대신에, 맨 앞에 있는 비트, 즉, 부호비트(MSB)가 1인 걸 보고

음수인지 추측할 수는 있을 것이라 생각한다.

 

다시 정리하자면 2의 보수 1의 보수를 취한 형태에서 더하기 1만 해주면 된다.

 

4. 1의 보수란

 

그렇다면 이제부터 1의 보수라는 것을 알아보자.

엄청 멀리 돌아서 온거 같지만 이제 1의 보수라는 녀석을 알아보면

적어도 1의 보수가 무엇을 의미하는지는 알 수 있을 것이라 생각한다.

 

1의 보수 10진수의 숫자를 2진수로 변환한 후

1을 0으로, 0을 1로 바꾼 아주 단순한 과정이다.

이것이 1의 보수라는 것이다.

그리고 앞서 언급했지만 당연하게도 정수형에만 사용이 가능하다.

 

그러면 왜? 도대체 왜? 1의 보수를 취하는 것일까?

 

바로 가산, 더하기 밖에 모르는 컴퓨터를 위해서

개발자들이 친절하게 음수라는 녀석을 알려주기 위해서 만들어진 것이다.

그렇다면 어차피 부호비트만 바꿔주면 되는거 아니냐고 할 수 있겠지만

그건 사용자, 우리들의 시선으로 바라보는 것이고

컴퓨터에서는 단순히 "하나만 딱" 바꾼다는 것은 할 수 없고

맨 앞의 부호비트를 바꿔주기 위해서 전체를 반대 값으로 바꿔줘야하는 것이다.

 

그래서 1의 보수라는 녀석이 툭 하고 튀어나온 것이다.

 

5. 마무리

 

단항 연산자 중에서 비트전환 연산자라는 녀석에 대해서 알아봤다.

이 녀석의 역할은

10진수의 (양수)정수를 2진수로 변환한 값에서

1은 0으로, 0은 1로 바꾸는 것, 다른 말로 1의 보수를 취하는 녀석이 되겠다.

 

그리고 1의 보수가 필요한 이유는 바로 2의 보수라는 녀석을 위해서인데

2의 보수는 더하기 밖에 모르는 컴퓨터에게 음수라는 숫자를 알려주기 위함이다.

즉, 2의 보수를 취한다는 것 양수를 음수로 바꿔준다는 뜻이 되겠다.

2의 보수를 취하는 과정은

10진수의 (양수)정수를 2진수로 변환한 값, 즉, 1의 보수에서

더하기 1을 해주면 2의 보수가 되겠다.

다시 말해 (양수)정수의 2의 보수 음수 정수가 되는 것이다.

Comments