11강 진법변환, 비트연산
자료 출처 - 깨알 C언어 | 11. 진법변환, 비트연산 - YouTube
진법변환이 컴퓨터에서 왜 필요하냐?
우리가 사용하고 있는 체계는 10진수 체계이다.
0~9까지 표현할 수 있는 10진수이다.
근데 컴퓨터는 1과 0밖에 모른다.
높은 전압 5V인 1
낮은 전압 1.5V인 0 밖에 모른다.
그래서 우리가 쓰는 10진수를 멍청한 컴퓨터한테 알려주기 위해서
진법을 변환해서 2진수로 바꿔줘야 된다.
8진수와 16진수는 주소체계
RAM 주기억장치의 주소체계가 8진수나 16진수, 보통 16진수로 되어있다.
그래서 진법변환이 중요하고 할 줄 알아야 된다.
진법변환을 하고 나서 비트연산을 할 줄 알아야 된다.
비트를 가지고 and하든, or하든, 여러 가지 연산을 통해서 값을 뽑아낼 수 있어야 된다.
비트
1과 0
진법변환 10진수 → 2진수
방법 1.
2로 더 이상 안 나눠질 때까지 나눈다.
19/2 = 9 _ 1
9/2 = 4 _1
4/2 = 2 _0
2/2 = 1 _0
그리고 거꾸로 올린다.
10011 (19를 2진수로 바꾼 결과)
방법 2.
19를 만들어준다.
16 + 2 + 1 = 19이다. 더하는 숫자들에 1을 넣어주고 나머지는 0을 넣어준다.
진법변환 2진수 → 8진수
오른쪽부터 3자리씩 자른다.
왜냐면 8진수는 한 자리당 0~7까지 표현할 수 있기 때문이다. 1+2+4=7
1이 들어있는 것을 더해준다.
2 , 2+1=3
그러면 23이 나온다.
발음할 때는
'이십삼이'이 아닌 '이삼'이라고 해야 한다.
진법변환 2진수 → 16진수
오른쪽부터 4자리씩 자른다.
왜냐면 16진수는 한 자리당 0~15까지 표현할 수 있기 때문이다. 1+2+4+8 = 15
1이 들어있는 것을 더해준다.
1, 2+1=3
그러면 16진수 13이 나온다.
발음할 때는
'십삼'이 아닌 '일삼'이라고 해야 한다.
비트연산자 종류
기호 | 의미 | 예 |
& | 비트 논리곱(AND) | 5 & 3 |
| | 비트 논리합(OR) | 5 | 3 |
^ | 비트 배타적 논리합(XOR) | 5 ^ 3 |
~ | 비트 NOT | ~5 |
>> | 비트값을 우측으로 이동 | 5 >> 3 |
<< | 비트값을 좌측으로 이동 | 5 << 3 |
문제는 5 & 3 이렇게 나온다.
친절하게 2진수로 나오는 것이 아닌 10진수의 숫자로 연산하라고 나온다.
그러면 5와 3을 2진수로 바꿀 줄 알아야 된다.
5는 2진수로 0101
3은 2진수로 0011
--------
5 & 3
and연산은 둘 다 참이여야 하므로 2진수로 0001이고, 10진수로 계산결과는 1이다.
5 | 3
or연산이다. 둘 중 하나만 참이어도 참이다. 2진수로 0111이고, 10진수로 계산결과는 7이다.
5 ^ 3
^ 애는 둘이 같은면 안된다. 같으면 0이고 틀리면 1이다. 2진수로 0110이고, 10진수로 계산결과는 6이다
~5
~ 는 양수일 때는 +1 하고 -를 붙여준다. 음수일 때는 -1 하고 +를 붙여준다. ~5의 계산결과는 -6이다.
[문제]
다음 c 프로그램의 실행 결과는?
#include<stdio.h> void main(){ int x = 0x11; int y, z; y = x & 0x0f; z = x | 0x0f; printf("x=%d, y=%d, z=%d", x, y, z); } |
① x=11, y=1, z=31
② x=11, y=31, z=1
③ x=17, y=1, z=31
④ x=17, y=31, z=1
답 : 3번
풀이과정
1. 변수 초기값 확인
int x = 0x11 (16진수 11)
int y =
int x =
2. 대입확인하기
y = x & 0x0f
z = x | 0x0f;
3. x를 2진수로 바꾸기
0x11는 16진수이므로 4개씩 끊어만든 공간에 각각의 자릿수가 1,1이라는 뜻이므로 00010001이다.
4. y = x & 0x0f
0x0f에서 이건 16진수로 앞 4 공간은 0이고 뒷 4 공간은 f를 뜻한다.
여기서 f는 모두 다 차 있는 것을 뜻한다.
즉, 0x0f진수로 바꾸면 00001111이다.
왜냐하면 16 진수 같은 경우 0~9까지는 숫자를 쓸 수 없고 10은 A가 되고, 11은 B가 되고, 12는 C가 되고, 13은 D가 되고,
14는 E가 돼고, 15는 F이다. 15를 [8 4 2 1]에 맞춰보면 다 1이 되어있어야지 15가 되기 때문에 다 차있는다.
& and 연산하기 (연산곱)
00010001
00001111
-------------
00000001
y라는 공간에 00000001이 들어간다. 이걸 10진수로 바꾸면 1이다.
5. z = x | 0x0f
0x0f
00001111
| or 연산하기 (연산합)
00010001
00001111
---------------
00011111
x라는 공간에 00011111이 들어간다. 이걸 10진수로 바꾸면 16+8+4+2+1 = 31이다.
6. 변수값 확인하기
x = 17
y= 1
z = 31