본문 바로가기
CS/BOOK

[한 권으로 읽는 컴퓨터 구조와 프로그래밍] 1. 컴퓨터 내부의 언어체계

by 벨롭 2024. 2. 21.
비트와 논리 연산

 

비트는 컴퓨터가 사용하는 언어로서, 0과 1을 기호로 사용한다.

 

하지만 컴퓨터는 0과 1만을 가지고도 수많은 말을 할 수 있다. 논리적 연산을 수행하기도 하며, 정수와 실수를 표현할 수 있고, 심지어 인간의 언어와 색깔까지도 표현할 수 있다.

 

먼저 비트는 논리연산을 통해 다른 비트들이 표현하는 내용으로부터 새로운 비트를 만들어낼 수 있다. 이 논리 연산을 하기위한 연산 규칙들의 집합을 불리언대수라고 한다. 수와 마찬가지로, 논리 연산에서도 결합법칙, 교환법칙, 분배법칙이 적용 가능하다.

 

기본 불리언 연산자에는 NOT, AND, OR이 있다.

NOT은 논리적 반대를 뜻한다. AND는 둘 이상의 비트에 적용되며, 모든 비트가 참이면 AND 연산의 결과도 참이 된다. OR연산은 둘 이상의 비트에 적용되며, 어느 한 비트라도 참이면 참이 된다.

 

이 기본 불리언 연산의 진리표는 아래와 같다.

 

 

그리고 이런 기본 불리언 연산자를 활용해서 또다시 새로운 연산을 만들어 낼 수도 있다.

대표적인 것이 XOR이다. 배타적 OR로써, 첫번째 비트와 두번째 비트가 다른 경우에만 참이 된다. a XOR b는 (a OR b) AND(NOT(a AND b)의 연산 결과와 동일하다.

 

 

 

 

 

비트와 정수 표현

 

 

정수 표현은 크게 양의 정수와 음의 정수를 표현하는 방법으로 나눌 수 있다.

 

먼저 양의 정수는 0과 1을 활용하는 2진법을 통해서 표현이 가능하다. n개의 비트로는 2^n개의 수를 표현할 수 있고, logN개의 비트로는 n개의 수를 표현할 수 있다. 즉, 비트의 갯수에 따라 표현할 수 있는 값의 범위가 달라진다.

 

이진수로 표현한 수는 논리 연산을 통해 덧셈또한 가능하다. 덧셈 결과는 a XOR b로, 올림수는 a AND b로 나타낼 수 있다. 이때 2진수의 덧셈 방향은 LSB --> MSB, 즉 가장 오른쪽의 비트에서 가장 왼쪽의 비트로 향한다. 

 

논리연산을 통한 이진수의 덧셈이 잘 이해가 가지 않는다면, 아래의 게시물을 참고하길 바란다.

2023.10.31 - [CS/컴퓨터구조] - [컴퓨터구조] CPU는 어떻게 작동할까? - ALU

 

[컴퓨터구조] CPU는 어떻게 작동할까? - ALU

CPU가 무엇인지 알지 못한다면 이전 포스팅을 먼저 보고 오시길 바란다. 2023.10.30 - [CS] - [컴퓨터구조] CPU와 메모리의 역할 개괄 [컴퓨터구조] CPU와 메모리의 역할 개괄 들어가며 컴퓨터 구조에 대

kyeong8139.tistory.com

 

 

 

그렇다면 음의 정수는 어떻게 표현할까? 0과 1을 사용하기 위해서 수많은 아이디어들이 나왔다. 누군가는 MSB로 부호를 나타내고, 나머지 비트를 절댓값을 표현하기 위해 사용하는 부호와 크기(sign and magnitude) 표현법을 활용했다. 또 누군가는 양수의 모든 비트를 뒤집어 표현하는 1의 보수(one's complement) 표현법을 제안했다.

 

하지만 현대의 컴퓨터가 가장 많이 사용 하는 방법은 2의 보수 표현법이다. 어떤 수의 비트를 뒤집고(각 비트의 NOT연산을 수행하고) 1을 더한다. 이 표현 방식의 장점은 위의 표현법들과는 달리 양의 정수처럼 덧셈(AND연산과 XOR연산을 통한 덧셈)이 가능하다는 점이다. 즉, 추가적인 하드웨어나 처리 없이 덧셈을 수행할 수 있다.

양수값 0 1 0 1
1의 보수 1 0 1 0
2의 보수 1 0 1 1

 

 

 

 

 

 

 

비트와 실수 표현

 

비트를 사용해 실수를 표현하는 방법은 크게 고정 소수점 표현법과 부동 소수점 표현법, BCD 세 가지로 나눌 수 있다.

 

고정소수점(fixed-point) 방법은 2진 소수점의 위치를 임의로 정하는 방법이다. 예를 들어 4비트로 실수를 표현한다면 2개의 비트는 정수를 표현하기 위해, 2개의 비트는 분수를 표현하기 위해 사용한다. 하지만 10진수가 1/10, 1/100등의 10의 거듭제곱을 분모로 사용하는 반면, 2진수에서는 1/2, 1/4등 2의 거듭제곱을 분모로 사용해야 한다. 2개의 비트로 분수를 표현한다면 00(2), 01(2), 10(2), 11(2) 이 네가지 분수밖에 표현할 수 없는 것처럼 말이다. 즉, 쓸모 있는 범위의 실수값을 표현하기 위해서는 필요한 비트의 개수가 너무나도 많다.

 

그래서 사람들은 과학자들이 사용하는 과학적 표기법을 활용하기로 했다. 과학자들은 가수(왼쪽이 한 자리뿐인 소수)와 10을 거듭제곱한 값(지수)을 곱하는 방식으로 소수를 표현한다. 이를 2진수에 적용해서, 가수와 지수를 나타내기위해 비트를 사용하기로 했고 이를 부동 소수점(floating point) 표현 방법이라고 했다. 

 

물론 이 방법도 완벽하지는 않았다. 가수가 0일때는 지수에 어떤 수가 오더라도 0이 되므로, 0을 표현하는 방법이 무척이나 다양하다. 또한 여전히 가능한 모든 수를 표현하지는 못한다.

 

이 단점을 보완하기 위한 표준이 바로 IEEE 부동 소수점 수 표준이다. 가장 대표적인 특징은 가수와 지수를 조정해서 가수의 맨 앞은 0이 없도록 만든다는 것이다. 그러면 가수의 맨 왼쪽 비트는 항상 1이므로 이를 생략하는게 가능해지고, 이 1개의 비트는 더 정확한 수를 표현하기 위해 활용할 수 있다. 또한 편향된 지수값을 표현함으로써 가수에 대한 부호비트만 사용하고, 지수에 대한 부호비트는 사용하지 않는다. 예를 들어 32비트 단정도 실수의 경우, 0111_1111(2)가 지수 0을 표현한다. 부호비트를 사용하지 않고도 음수와 양수를 모두 표현할 수 있어진 것이다. 

 

BCD(binary-coded decimal)은 4비트를 사용해 10진 숫자 하나를 표현한다. 예를 들어 12라는 십진수는 0001_0010으로 나타내는 식이다. 다만 4비트는 16개의 숫자를 표현할 수 있지만, 10진수는 0~9까지 10개의 숫자를 표현하기 떄문에 효율적이지는 못하다. 따라서 현대의 컴퓨터에서는 주로 부동 소수점 방식을 활용한다. 

 

 

 

 

 

 

비트와 텍스트 표현

 

비트로 텍스트를 표현하기 위한 방법은 간단하다. 연필이라는 단어가 흑연이 있어 글씨를 쓸 수 있는 도구를 나타내기로 약속했듯이, 특정 숫자를 문자라고 치고 생각하기로 했다.

 

예를 들어 아스키코드에서는 65라는 숫자는 A를 나타내기로 했다. 이 외에도, 키보드에 있는 모든 기호에 대해 7비트 수 값을 할당해줬다. 초창기 컴퓨터는 영어권에서 만들어졌으므로 큰 문제가 없었다. 하지만 시간이 흘러 영어가 아닌 다른 언어를 표현할 필요가 생겨났다. EUC-KR처럼 여러 문자셋들이 생겨나다가, 현재에는 32비트의 코드를 사용하는 유니코드가 대중화되었다. 

 

하지만 아스키코드가 8비트만을 사용했던 것에 비해, 32비트의 유니코드는 비용적인 부담이 늘어났다. 따라서 인코딩을 통해 유니코드를 변환하는 과정을 거친다. UTF-8을 사용할 경우, 한글을 표현하기 위해서는 3바이트만 사용해도 충분하다.

 

 

 

 

 

 

 

비트와 색 표현

 

 

색을 표현하기 위해 대표적으로 사용되는 방법은 RGB 표현법이다. 빨간색, 녹색, 파란색 광선을 섞어서 만드는 시스템인데, 빛처럼 가산시스템을 활용한다. 예를 들어 빨간색, 녹색, 파란색을 모두 가능한 한 최대 밝기로 킬 경우 흰색이 되는 식이다. 

 

이 RGB 표현법은 24비트 (3바이트)에 색을 저장하는데, 컴퓨터상에서는 32비트인 워드단위로 저장이 된다.그래서 여기서 추가된 개념이 알파값이다. 남은 8비트에는 투명도 값인 알파값을 저장한다. 

 

이처럼 컴퓨터에서는 0과 1, 단 두 가지의 기호를 사용해 숫자부터 문자, 색깔까지 수많은 데이터를 저장하고 있다.  

 

 

 

 

 

 

 

 

 

 

 

-- 확인 문제 -- 

 

1. (a OR b) AND(NOT(a AND b))의 진리표를 작성하시오.

 

 

2. 비트로 실수를 표현하기 위해 비트를 정수와 분수부분으로 나누어 표현하는 고정 소수점 방식과 달리, 부동 소수점 방식은 수를 A와 B로 나누어서 표현한다. IEEE 부동 소수점 수 표현에서는 A와 B를 조정해 A의 맨 닾은 0 이 없도록 만들고, 맨 왼쪽 비트인 1을 생략한다. 또한 편향된 B값을 사용함으로써 B의 부호비트는 사용하지 않고, A에 대한 부호비트만 사용한다. A와 B에 들어갈 말은?