언어/C언어_기초

11강 진법변환, 비트연산

hyehh 2023. 7. 17. 14:40
728x90
반응형
SMALL
728x90
반응형
SMALL

자료 출처 - 깨알 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


자료 출처 - 깨알 C언어 | 11. 진법변환, 비트연산 - YouTube

728x90
반응형
LIST