본문 바로가기
깨알 c언어

깨알 c언어 ch.11 ~ 15

by moca7 2024. 2. 22.

11. 진법변환, 비트연산

12. 매크로, 비트연산

13. 삼항 연산자

14. if문, switch문

15. 반복문, for문

 

 

 

11. 진법변환, 비트연산

 

ㅁ 진법 변환이 왜 필요하냐. 우리는 0~9까지 표현하는 10진수를 쓰고 있음. 컴퓨터는 1과 0밖에 모름. 

16진수나 8진수는 주소체계. 렘(주기억장치)의 주소체계가 8진수나 16진수로 되어 있기 때문이다.

 

ㅁ 어떤 값을 대입할 때 8진수면 앞에 0을 붙임. 

어떤 값을 대입할 때 16진수면 앞에 0x를 붙임.

 

 

ㅁ 8진수라는건 0~7까지 표현하는거. 그래서 3자리씩 끊음. 4 + 2 + 1 = 7

 

 

(1) 5&3

0101

0011 = 0001(이진수) 1(십진수)

 

(2) 5I3

0101

0011 = 0111(이진수) 7(십진수) 

 

(3) 5^3                <----  둘이 서로 달라야 참임. exclusive or

0101

0011 = 0110(이진수) 6(십진수)

 

(4) ~5

- 5는 2진수로는 0101이다.

1의 보수 방식으로 비트를 뒤집으면 1010이 된다.

MSB(최상위 비트)가 1로 시작하는 비트는 음수이므로 0을 가진 비트의 값을 계산한다.

2^2 + 2^0= 5이다.

2의 보수는 1의 보수 방식에서 1을 더한 값이므로 5+1이고 음수 기호를 붙여 최종적으로 -6이 된다. 

( ~-6은 5다.)

 

~-5

음수를 비트로 표현하려면, 우선 부호를 빼고 2진수로 표현한다. 0101. 비트를 반전시키고 1을 더한다.

1011. -5는 1011이다.

~-5는 0100이다. 답은 4.

 

정리하면, ~양수는 절대값에 1을 더하고 부호 바꾸면 된다.

~음수는 절대값에 1을 빼고 부호 바꾸면 된다. 

 

ㅁ 문제

 

 

- x는 16진수로 11이다. 

8 4 2 1 8 4 2 1

0 0 0 1 0 0 0 1 (이진수) = 17(십진수)

 

- 0x0f는 15를 뜻한다. 16진수는 0~9와 A(10), B(11), C(12), D(13), E(14), F(15)를 사용한다.

0 0 0 0 1 1 1 1

- y는 1, z는 31.

 

 

12. 매크로, 비트연산

 

 

ㅁ 매크로란 반복적인 일들을 쉽게 하기 위해 만들어 놓은 것. 
함수도 있지만 함수는 한 번 호출하면 사라져 버림.
매크로는 모든 프로그램에 공통적으로 들어가게 할 수 있음. 전처리기에서 처리해서.

ㅁ  #define N 10
- #define: 매크로 선언
- 앞으로 나오는 모든 N을
- 10으로 대체함.

ㅁ #define SQR(X) X*X
- X라는 인자를 받게 되면
- X*X를 수행

ㅁ 매크로 선언 방법은 두가지. 변수처럼 선언하거나 함수처럼 선언.

ㅁ SQR(N); 
- 출력결과. 100

ㅁ SQR(N+2);
- 출력결과. 144가 아님. 함수로 선언했을 때는 N+2를 계산하는게 맞는데 매크로로 선언했을 때는 그대로 넘김.
- 10 + 2 * 10 + 2 = 32다.

ㅁ 시프트 연산(>>)
- 비트 연산이라 이진수로 바꿔야 함.

(1) 10 >> 2
- 10을 이진수로 변환하면 1010. 이걸 우측으로 2개 밀어라. 그러면 10(이진수), 2(십진법)
- 밀어진 것들은 아예 사라짐.

(2) 10 << 2
- 0000 1010이니까 0010 1000이 됨. 40(십진법)
- 새로 생겨난 것들은 0이다.

ㅁ 문제



- i =  0이다. 정수 나누기 정수는 정수이므로 소수점 아래는 버린다. 
value1은 1이므로 0000 0001 
value2는 2이므로 0000 0010
j = 0000 0000
k = 0000 0011 = 3(십진법)

if 조건은 j는 거짓이므로 &&오른쪽은 보지도 않고 0이 된다. II 오른쪽도 거짓이므로 els문 수행.
m = j + k = 3

i = 0, j = 0, k = 3, m = 3이다. 출력형식에 맞게 출력하면, 

출력결과.
i = 0.0 j = 0 k = 3 m = 003


13. 삼항 연산자

ㅁ 삼항 연산자
- 조건에 따라서 다른 명령을 수행 하는 연산자.
- 구조: 조건 ? 참 : 거짓

ㅁ 예제
int a = 10>5 ? 10 : 5; 
printf("%d", a); 출력결과는 10

ㅁ 문제


b = 40

출력결과. b=40


14. if문, switch문

ㅁ switch문은 break안 걸면 그 다음의 것들와 default까지 다 나옴. 
switch조건에 맞는 인자가 없으면 그냥 default 출력

ㅁ 문제


답. 1

만약 전부 break가 없다고 가정하면, 
출력결과는
1
3
3

어렵게 내면 case를 여러개 두고 어떤건 break를 쓰고 어떤건 break를 안씀. 
break가 있을때까지 수행한다. break있으면 탈출한다. 


15. 반복문, for문

 

ㅁ 변수, 제어문(if문, switch문), 반복문만 가지고도 프로그램 충분히 짤 수 있다.
포인터, 배열 안 써도 됨. 실제 프로그램도 제어문과 반복문의 덩어리다.

ㅁ 반복문 종류
(1) for
- 정해진 횟수만큼 반복
(2) while
- 조건이 만족하는 동안 반복
(3) do ~ while
- 무조건 한 번 수행 후 조건이 만족하는 동안 반복

 

ㅁ for 구조

- for (초기식; 조건식; 증감식)

{ 수행하는 작업들 }

 

초기식은 처음 딱 한 번만 수행. 그 다음 조건식. 그 다음 작업 수행. 그 다음 증감식. 그 후 조건식.

 

ㅁ 문제

 

j=2, sum = 1이 되고 j는 7       j=7, sum = 2가 되고 j는 12          j=12, sum = 3이 되고 j는 17

j=17, sum = 4이 되고 j는 22       j=22, sum = 5가 되고 j는 27          j=27, sum = 6이 되고 j는 32

j=32, sum = 7이 되고 j는 37       j=37, sum = 8가 되고 j는 42          j=42, sum = 9이 되고 j는 47

j=47, sum =10이 되고 j는 52       j=52, sum = 11가 되고 j는 57          j=57, sum =12이 되고 j는 62

j=62, sum = 13이 되고 j는 67       j=67, sum = 14이 되고 j는 72    

출력결과. 14

 

 

 

'깨알 c언어' 카테고리의 다른 글

깨알 c언어 ch.26 ~ 30  (0) 2024.03.08
깨알 c언어 ch.21 ~ 25  (0) 2024.02.22
깨알 c언어 ch.16 ~ 20  (0) 2024.02.22
깨알 c언어 ch.6 ~ 10  (0) 2024.02.21
깨알 c언어 ch.1 ~ 5  (1) 2024.02.21