-
수 표기 1편System Programming 2019. 9. 11. 01:00
비트와 바이트
비트의 모습이다. 비트는 0 또는 1로 나타내는 정보의 최소단위이며, 비트 8개를 하나로 묶어서 1바이트로 취급한다.
비트 8개이므로 \(2^8\)=256가지의 정보를 표현할 수 있으며, 이 때문에 십진수로는 0부터 255, 십육진수로는 00부터 FF까지로 표기된다.
부울(불) 대수
불 대수는 불이 붙은 물건의 상태를 서술하는 것이다. -백괴사전-
...농담이고, 실제로는 참/거짓을 나타내는 것이다. 참은 1, 거짓은 0으로 나타내며, 이를 이용한 논리 연산을 불 연산이라 한다.
불 대수의 기본적인 연산은 총 4가지로, &, |, ~, ^이다.
&는 논리곱으로, p와 q가 1이어야만 1을 return한다.
& 0 1 0 0 0 1 0 1 |는 논리합으로, p와 q 중 1이 있으면 1을 return한다.
| 0 1 0 0 1 1 1 1 ~는 논리부정으로, 0이면 1을, 1이면 0을 return한다.
~ 0 1 1 0 ^는 배타적 논리합이며, XOR로 표기한다. 두 값이 서로 달라야 1을 return한다.
^ 0 1 0 0 1 1 1 0 논리 연산은 0과 1뿐만 아니라, 비트 벡터에도 이용 가능하다. 비트 벡터란 0, 1로 이루어진 스트링을 의미한다. 이 경우, 같은 자릿수의 벡터마다 연산을 해 주면 된다.
예시: 1011, 0011의 XOR 연산
1 0 1 1 ^ 0 0 1 1 1 0 0 0 C의 비트 연산은 정수형으로 바꿔먹을 수 있는 모든 것에 대해 적용할 수 있다. 논리연산과 헷갈리지 말 것.
시프트 연산
비트를 좌/우로 미는 행위를 의미한다.
잘봐 첫번째 사진에서는... 좌측 시프트: 비트를 왼쪽으로 민다. 가장 왼쪽에 있던 밀려나간 숫자들은 사라지며, 오른쪽의 빈공간은 0으로 채워진다.
ex)0010010<<3: 0010000.
우측 시프트: 비트를 오른쪽으로 민다. 오른쪽에 있던 밀려나간 숫자들이 사라지는 건 똑같지만 왼쪽의 빈칸을 어떻게 채우느냐에 대한 방법론이 문제.
- 논리 우측 쉬프트: 빈칸을 전부 0으로 채운다. unsigned 형태에서 이용한다.
- 산술 우측 쉬프트: MSB(가장 왼쪽 비트)로 채운다.
Unsigned와 2의 보수, 그리고 이진수와의 관계
이진수를 Unsigned 형태의 자료형으로 변환하는 것은 B2U(Binary to Unisnged)라고 부른다.
$$B2U(\vec{x})=\sum_{i=0}^{w-1}{x}_{i}{2}^{i}$$
와 같이 나타낸다. 일반적으로 생각하는 이진수를 십진수로 바꾸는 방법과 과정이 흡사하다. 이 방법은 '부호가 없는' 자료형으로 형변환을 실행하므로, 양수(또는 0)에 대해서만 실행가능하다. 하지만 분명히 프로그램 처리 과정에서 음수를 처리해야 할 때가 오므로, 이럴 때에는 다른 형태의 형변환을 이용한다. 음수는 2의 보수를 이용하여 나타내므로, 이제는 2의 보수로 이진수를 변환한다. 이를 B2T(Binary to 2's complement)라 부른다.
$$B2T(\vec{x})=-{x}_{w-1}+\sum_{w-2}^{i=0}{x}_{i}{2}^{i}$$
B2T는 결과로 나올 2의 보수의 자릿수에 따라 결과가 달라진다. 2의 보수는 가장 높은 자리수 하나를 sign bit로 기용하기 때문이다. Sign bit가 1이면 음수이고, 0이면 양수인 것을 상기한 형태로 나타낸다.
이로 인해 2의 보수로 나타낼 수 있는 수의 절댓값은 항상 음수가 양수보다 1 크다. 가장 작은 수인 Tmin은 100...0으로 나타내며, 가장 큰 수인 Tmax는 011...1로 나타낸다. -1은 111...1로 나타낸다.
Unsigned와 2의 보수 간의 변환
2의 보수를 unsigned로 바꿀 경우는 T2B와 B2U를 연속으로 한다. 반대의 경우는 U2B와 B2T를 연속으로 한다.
2의 보수를 unsigned로 바꿀 경우 범위가 겹치는 0부터 Tmax까지는 그대로이나, 2의 보수에서 -1부터 Tmax+1에 대응되고, 최종적으로 Tmin은 Umax에 대응된다.
비트의 크기 변환
비트를 더 크거나 작은 자릿수로 바꿔야 할 때가 있다.
비트 확장: w비트의 signed int를 w+k비트로 바꾸는 것. 이 때는 sign bit k개로 이루어진 스트링을 원 비트의 왼쪽에 붙인다.
비트 절삭: w+k비트의 벡터를 w비트의 다른 형태로 바꾸는 것. unsigned의 경우, 자릿수가 k 이상인 모든 비트를 0으로 만든다.
'System Programming' 카테고리의 다른 글
조건 코드 (0) 2019.10.02 프로그램 작동의 기초 (0) 2019.10.01 부동 소수점 표현 (0) 2019.09.22