20260404 프로그래밍기초 5주차
주제: 연산자
영어단어
- 연산자: operator
- 연산에 사용되는 값 또는 변수 or 식: operand
연산자 (operator)
- (단산비논삼대로 외우기)
우선순위 1번: 단항 연산자
- operand는 변수만 사용할 수 있음
++, --(플러스와 마이너스는 전위/후위 표기법이 가능), !, ~
우선순위 2번: 이항 연산자
1. 산술 연산자
+, -, *, /(파이썬에서는 정수 / 정수를 하면 소수점 나눗셈을 해버려서 //를 사용), %, &,, |, <<, >>(오른쪽 2개는 곱셈,나눗셈이 가능함)
2. 비교 연산자
>, <, >=, <=, !=, ==
3. 논리 연산자
&&, ||,&(허나 비트 계산이라서 산술 연산자에 좀 가까움)
우선순위 3번: 삼항 연산자
- 물음표 연산자:
?(A ? B : C)
우선순위 4번: 대입 연산자
- 이퀄스가 들어간 연산자:
= - 축약 연산자:
+=, -=, *=, /=, %=, |=, &=, ^=
전위 / 후위 표기법
- 앞에 적는거랑 뒤에 적는거랑 결과가 다름
- 보통
++하고--가 있음 - 전위 사용 시 (i++)에는 증가/감소 우선 사용 후 식 반영
- 후위 사용 시 (++i)에는 식 반영 후 증가/감소 사용
문제
int i = 1;
int result = i++ + ++i ;
이때 result의 값과 i의 값은?
단계별 연산 과정 (컴퓨터가 계산하는 순서)
- i++ (후위 연산) 실행:
- 현재의 i 값인 1을 먼저 연산에 쓰기 위해 찜해둡니다.
- 그 직후 i는 1 증가하여 2가 됩니다.
- (현재 상태: 식에는 1이 남고, i는 2)
-
- (더하기) 대기:
- 앞에서 찜해둔 1과 다음 결과를 더할 준비를 합니다.
- ++i (전위 연산) 실행:
- 현재 i가 2인 상태에서 먼저 1을 증가시킵니다.
- i는 3이 됩니다.
- 증가된 결과인 3을 연산에 사용합니다.
- (현재 상태: i는 3)
- 최종 더하기:
- 1 (첫 번째 항) + 3 (두 번째 항)
result가 4, i가 3
두번 째 문제
#define LOGIN 1<<0
일때 값
<<는 왼쪽으로 비트를 밀어라라는 뜻
1<<0은 0000 0001 이니 1
1<<1은 0000 0010 이니 2
1<<2는 0000 0100 이니 4
1<<3는 0000 1000 이니 8
세번 째 문제
#define LOG_IN 1<<0 //0001
#define IS_ADMIN 1<<1; //0010
#define NOTIFICATION 1<<2; //0100
unsigned char status = 0; //0000으로 봐도됨
status |= LOG_IN; //0001 //XOR 계산
status |= NOTIFICATION; //0101 //XOR 계산
if (status & LOG_IN) {}
if (status & ADMIN) {}
과제
쉬프트 연산자를 사용하여 사용자가 입력한 두 수의 곱셈과 나눗셈을 수행하는 코드를 작성하시오.
- scanf() 함수로 키보드로 부터 두 수를 입력 받는다.
- 쉬프트 연산자와 반복문을 사용하여 두 수의 곱셈 결과를 출력한다.
- 동일한 방법으로 나눗셈 결과를 출력한다.
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#include<stdio.h>
int main() {
// 과제: 반복문을 통한 곱하기
int A;
int n; //곱할 수
int result = 0;
int temp_n;
int shift = 0;
#pragma warning(suppress:4996)
scanf("%d %d", &A, &n); // A와 n을 입력받음
temp_n = n;
//n의 각 비트를 검사하며 A를 쉬프트해서 더함
while (temp_n > 0)
{
if (temp_n & 1) { //n의 가장 오른쪽 비트가 1인지 검사
result += A << shift; //A를 shift만큼 왼쪽으로 쉬프트하여 result에 더함
}
temp_n >>= 1; //n을 오른쪽으로 1비트 쉬프트하여 다음 비트를 검사
shift++; //쉬프트 카운터 증가
}
printf("%d * %d = %d\n", A, n, result); // 130, A와 n을 곱한 결과를 출력)
// 과제: 반복문을 통한 나누기
int B;
int m; //나눌 수
int quotient = 0;
int temp_m;
int shift_div = 0;
#pragma warning(suppress:4996)
scanf("%d %d", &B, &m); // B와 m을 입력받음
temp_m = m;
//m의 각 비트를 검사하며 B를 쉬프트해서 더함
while (temp_m > 0)
{
if (temp_m & 1) { //m의 가장 오른쪽 비트가 1인지 검사
quotient += B >> shift_div; //B를 shift_div만큼 오른쪽으로 쉬프트하여 quotient에 더함
}
temp_m >>= 1; //m을 오른쪽으로 1비트 쉬프트하여 다음 비트를 검사
shift_div++; //쉬프트 카운터 증가
}
printf("%d / %d = %d\n", B, m, quotient); // 5, B와 m을 나눈 결과를 출력)
return 0;
}