연산자(2) Chapter 6 Kum Deuk Kyu , Ph. D. Spring 2015 PMP, CISA, ISO 9001 Auditor Dept. of Computer Software DongSeoul University dkkum@hanmail.net, dkkum73@gmail.com
Contents 복습 예제 응용 예제 연산자(2)
복습 예제(1/2) 이것만은 알고 갑시다. 1. C++의 주요 타입을 나열해 보았다. 아래와 같이 비슷한 성격을 갖는 타입으로 묶어보자. 2. 아래 빈 칸을 채워보자. 1바이트는 ( 8 ) 비트다. 타입의 크기를 알아내기 위해서 ( sizeof() ) 연산자를 사용한다. bool, int, double, long, unsigned char, wchar_t, unsigned int, char, float, short, unsigned short, unsigned long 정수를 담는 용도의 타입 Short, int, long 문자를 담는 용도의 타입 char, unsigned char, wchar_t 실수를 담는 용도의 타입 Float, double 0과 양수만 담을 수 있는 타입 Bool Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
복습 예제(2/2) 3. 변수에 저장한 값이 같더라도 타입에 따라 다르게 해석한다는 점을 확인하기 위한 소스코드다. 아래와 같은 실행 결과가 나올 수 있도록 소스 코드의 빈 곳을 채워보자. #include <iostream> using namespace std; int main() { float f = 65.5f; cout << "float = " << f << endl; cout << "int = " << [ (int) ]f << endl; cout << "char = " << [ (char) ]f << endl; return 0; } 실행결과 float = 65.5 int = 65 char = A Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
응용 예제 4-1 치환연산자의 사용(1/2) 치환 연산자 치환 연산자의 종류 a+=1은 a=a+1과 같으며, b*=2는 b=b*2와 같다. 치환 연산자는 산술 연산자 뿐 아니라, 비트 연산자 등의 다른 연산자와도 동일한 방식으로 조합될 수 있다. Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
응용 예제 4-1 치환연산자의 사용(2/2) 01 #include<iostream> 02 using namespace std; 03 int main(int argc, char* argv[]) 04 { 05 06 int x = 1; 07 int y = 2; 08 int z = 3; 09 int w = 4; 10 int v = 5; 11 12 int a,b; 13 a = b = 1; 14 15 x += 1; 16 y -= 1; 17 z *= 2; 18 w /= 2; 19 v %= 2; 20 21 cout << "x += 1 --> " << x << "\n"; 22 cout << "y -= 1 --> " << y << "\n"; 23 cout << "z *= 2 --> " << z << "\n"; 24 cout << "w /= 2 --> " << w << "\n"; 25 cout << "v %= 2 --> " << v << "\n"; 26 cout << "a = " << a << ", b = " << b << "\n"; 27 28 return 0; 29 } 변수를 선언한다. 사칙 연산과 치환을 수행 한다. Fire at a Research Center Engineer Physicist Mathematics S/W Engineer 결과를 출력한다.
연산자(2)
논리 연산자(Logical Operators) 관계 연산자들을 이용해서 관계에 대해 표한할 수 있게 되었으나, ‘x>y and v<w’와 같은 여러 관계 들에 대해서는 어떻게 표현할까? 피연산자를 사용해서 부울 연산을 수행한다. 피연산자1 피연산자2 AND(&&) OR(||) NOT(!) false true Fire at a Research Center Engineer Physicist Mathematics S/W Engineer * NOT 연산자는 피연산자1 만 받는다.
관계연산자와 논리연산자 일반적으로 논리연산자는 관계연산자와 함께 사용한다. 관계연산자의 우선순위가 높으므로 먼저 수행된다. int age = 20; // 나이 bool male = true; // 성별 // 20세 이상이면서 남성인지 여부를 알아봄 bool ok = age >= 20 && male == true Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
*아래 실행 결과가 출력되도록 코드를 추가해보세요 ^^!! 논리 연산자의 사용 1 예제 6-6 AND, OR 연산자 함께 사용하기 (예제 6-6, p114) int main() { // 키와 시력을 보관할 변수를 정의한다. int height; float eyesight; // height, eyesight 값을 입력받는다. // ( 여러분은 아직 입력 받는 법을 배우지 않았으므로 // 소스 코드 상에서 그냥 대입한다) height = 175; eyesight = 0.8f; // 조건을 만족하는지 검사한다. // 자격을 갖춘 사람인가? bool ok; ok = height >= 160 && height <= 180 || eyesight >= 1.0f && eyesight <= 2.0f; return 0; } *아래 실행 결과가 출력되도록 코드를 추가해보세요 ^^!! Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
논리 연산자의 사용 2 응용 예제 4-2 01 #include<iostream> 02 using namespace std; 03 int main(int argc, char* argv[]) 04 { 05 06 int math = 85; 07 08 bool bGrade1 = math >= 90; 09 bool bGrade2 = math >= 80 && math < 90; 10 bool bGrade3 = math >= 70 && math < 80; 11 bool bGrade4 = math >= 60 && math < 70; 12 bool bGrade5 = math < 60; 13 14 cout << " 수 = " << bGrade1 << "\n"; 15 cout << " 우 = " << bGrade2 << "\n"; 16 cout << " 미 = " << bGrade3 << "\n"; 17 cout << " 양 = " << bGrade4 << "\n"; 18 cout << " 가 = " << bGrade5 << "\n"; 19 20 return 0; 21 } 변수를 선언한다. 논리 연산을 수행 한다. 결과를 출력한다. Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
10진수, 2진수, 16진수 변환 진법 표현 10진수 15624=1*(10^4)+5*(10^3)+6*(10^2)+2*(10^1)+4*(10^0) 2진수 1101101=1*(2^6)+1*(2^5)+0*(2^4)+1*(2^3)+1*(2^2)+0*(2^1)+1*(2^0) = 1*64+1*32+0*16+1*8+1*4+0*2+1*1=64+32+8+4+1 = 109(십진수) 진법 변환 10진수 를 2진수(37 -> 100101), 16진수로(524 -> 20C) 16진수는 {0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}를 사용. 즉, 16진법의 기호를 10진법으로 나타내면 a=10, b=11, c=12, d=13, e=14, f=15 에 해당 여기서 ‘^’ 기호는 좌승을 의미한다.!! 10 ^4 = 10의4제곱승 Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
Exercise 6.2 10진수, 2진수, 16진수 변환 연습 진수 변환 법 연습 이 변환 연습은 많이 할 수록 좋다. 실제로 쓸 일도 많고, 조금만 연습해도 금방 익숙해진다. 빈 칸을 채우자. * 16진수는 4비트가 하나의 16진수로 변환되며 0x로 시작하는 것으로 표현할 수 있다. 2진수 16진수 10진수 1101 D 13 10100011 A3 163 110011101001 CE9 3305 1010 0xA 10 10011011 0x9B 155 Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
비트단위 연산자 (Bitwise Operators) 비트단위 논리 연산자(Logical Bitwise Operators)는 각각의 비트를 대상으로 논리 연산을 수행한다. Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
비트단위 논리 연산자의 종류 각 비트를 대상으로 다음과 같이 연산한다. 피연산자1의 i 번째 비트 피연산자2의 i번째 비트 AND(&) OR(|) XOR(^) NOT(~) 1 * NOT 연산자는 피연산자1 만 받는다. Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
비트단위 논리 연산자의 예 178과 113을 사용해서 4가지 비트단위 논리 연산을 수행 unsigned char a, b; unsigned char c1, c2, c3, c4; c1 = a & b; // AND c2 = a | b; // OR c3 = a ^ b; // XOR c4 = ~a; // NOT Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
*2진수로 출력하기 위해서는 bitset 클래스가 필요하다.!! 비트연산자의 사용 (예제 6-9) 178과 113을 사용해서 4가지 비트단위 논리 연산을 수행 #include <bitset> #include <iostream> using namespace std; int main() { // 피연산자를 준비한다. unsigned char a, b; a = 178; b = 113; // 비트단위 논리 연산을 수행 unsigned char c1, c2, c3, c4; c1 = a & b; // AND c2 = a | b; // OR c3 = a ^ b; // XOR c4 = ~a; // NOT // 결과를 출력한다. // 괄호안에는 10진수가 출력된다. cout << "a = " << bitset<8>(a) << "(" << (unsigned int)a << ")\n"; cout << "b = " << bitset<8>(b) << "(" << (unsigned int)b << ")\n"; cout << "a & b = " << bitset<8>(c1) << "(" << (unsigned int)c1 << ")\n"; cout << "a | b = " << bitset<8>(c2) << "(" << (unsigned int)c2 << ")\n"; cout << "a ^ b = " << bitset<8>(c3) << "(" << (unsigned int)c3 << ")\n"; cout << "~a = " << bitset<8>(c4) << "(" << (unsigned int)c4 << ")\n"; return 0; } *2진수로 출력하기 위해서는 bitset 클래스가 필요하다.!! Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
비트단위 논리 연산의 응용 (예제 6-10) 16비트 크기를 갖는 unsigned short 타입 변수에 한 점의 색상이 보관되어 있다고 가정. 파란색에 해당하는 부분의 밝기를 구하라!! 컴퓨터 상 색상 표현 : RGB(빨강, 초록, 파랑)를 16비트 색상으로, R(5비트), G(6비트), B(5비트) 씩 할당 주요 색상을 2진수로 표현하면 빨강 – 11111 000000 00000 , 초록 - 00000 111111 00000, 파랑 - 00000 000000 11111 #include <bitset> #include <iostream> using namespace std; int main() { // 한 점의 색상을 보관하는 변수 // (임의의 값을 넣어둔다) unsigned short color = 0x1234; // 파란색을 제외한 나머지 비트를 지운다. // 0x001f는 2진수로 0000 0000 0001 1111이다. unsigned short blue; blue = color & 0x001f; // 결과 출력 cout << "color = " << bitset<16>(color) << "(" << color << ")\n"; cout << "blue = " << bitset<16>(blue) << "(" << blue << ")\n"; return 0; } *비트 단위 AND 연산을 수행해서 필요치 않은 비트들을 0으로 만들어 버림으로써 파란색의 정보만 남게 함!! *0x001f는 파란색이 위치하는 오른 쪽 다섯개의 비트만 1인 이진수를 16진수로 표현한 것!! Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
쉬프트 연산자 (예제 6-11, p127) 쉬프트 연산자는 비트를 몇 칸씩 옆으로 이동시킴. (녹색 부분의 값 구하기) #include <bitset> #include <iostream> using namespace std; int main() { // 한 점의 색상을 보관하는 변수 // (임의의 값을 넣어둔다) unsigned short color = 0x1234; // 녹색을 제외한 나머지 비트를 지운다. // 0x07e0은 2진수로 0000 0111 1110 0000이다. unsigned short green_temp; green_temp = color & 0x07e0; // 녹색의 비트들을 오른쪽 끝으로 이동시킨다. unsigned short green; green = green_temp >> 5; // 결과 출력 cout << " color = " << bitset<16>(color) << "(" << color << ")\n"; cout << "green_temp = " << bitset<16>(green_temp) << "(" << green_temp << ")\n"; cout << " green = " << bitset<16>(green) << "(" << green << ")\n"; return 0; } Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
쉬프트 연산자 2 (예제 6-12, p129) 빨간색 부분의 값 바꾸기 Fire at a Research Center #include <bitset> #include <iostream> using namespace std; int main() { // 한 점의 색상을 보관하는 변수 // (임의의 값을 넣어둔다) unsigned short color = 0x1234; // 빨간색 부분의 비트들을 0으로 만든다. // 0x07ff는 2진수로 0000 0111 1111 1111 이다. unsigned short color_temp; color_temp = color & 0x07ff; // 새로운 빨간색의 값을 준비한다. unsigned short red = 30; // 빨간색의 값을 왼쪽 끝으로 옮긴다. unsigned short red_temp; red_temp = red << 11; // 빨간색의 값을 색상에 넣는다. unsigned short color_finished; color_finished = color_temp | red_temp; // 결과 출력 cout << " color = " << bitset<16>(color) << "(" << color << ")\n"; cout << " color_temp = " << bitset<16>(color_temp) << "(" << color_temp << ")\n"; cout << " red = " << bitset<16>(red) << "(" << red << ")\n"; cout << " red_temp = " << bitset<16>(red_temp) << "(" << red_temp << ")\n"; cout << "color_finished = " << bitset<16>(color_finished) << "(" << color_finished << ")\n"; return 0; } Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
연산자의 축약형 연산자의 축약형을 사용해서 번거로운 코딩을 줄일 수 있다. 축약형 같은 의미의 수식 a += b; a = a + b; a -= b; a = a – b; a *= b; a = a * b; a /= b; a = a / b; a %= b; a = a % b; a &= b; a = a & b; a |= b; a = a | b; a ^= b; a = a ^ b; a <<= b; a = a << b; a >>= b; a = a >> b; Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
*전치 연산과 후치 연산은 서로 다른 결과를 내놓게 된다.!! 축약형 연산자의 사용 (예제 6-14, p 135) + +, - - 연산자의 사용 #include <iostream> using namespace std; int main() { // 4 개의 변수를 동일한 값으로 채운다. int A, B, C, D; A = B = C = D = 3; // 다양하게 ++, -- 연산자를 사용한다. int ppA, Bpp, mmC, Dmm; ppA = ++A; Bpp = B++; mmC = --C; Dmm = D--; // 결과를 출력한다. cout << " A, B, C, D : " << A << ", " << B << ", " << C << ", " << D << "\n"; cout << "++A, B++, --C, D-- : " << ppA << ", " << Bpp << ", " << mmC << ", " << Dmm << "\n"; return 0; } *전치 연산과 후치 연산은 서로 다른 결과를 내놓게 된다.!! Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
Kum Deuk Kyu Mobile 010-5334-2448 dkkum@hanmail.net, dkkum73@gmail.com Q & A Thank You ! 여러분은 누구보다 위대하고 존귀한 존재이며, 사랑하는 하나님의 자녀입니다. 학업이나 진로, 개인적인 상담을 원하시는 분은 아래 연락처로 연락주세요..^^ Kum Deuk Kyu Mobile 010-5334-2448 dkkum@hanmail.net, dkkum73@gmail.com