Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chapter 07 비트와 여러 연산자.

Similar presentations


Presentation on theme: "Chapter 07 비트와 여러 연산자."— Presentation transcript:

1 Chapter 07 비트와 여러 연산자

2 조건 연산자 조건 삼항 연산자 조건 연산자는 C 언어에서 유일하게 세 개의 피연산자를 갖는 삼항 연산자
연산식 exp1이 0이 아닌 값(참을 의미)으로 평가되면, 삼항 연산자의 평가값은 두 번째 연산식인 exp2의 값으로 평가 연산식 exp1이 0(거짓을 의미)으로 평가되면 삼항 연산자의 평가값은 세 번째 연산식인 exp3의 값으로 평가 이 연산식은 변수 courses의 값이 1일 경우, 조건연산자의 평가 값은 문자 ‘A’이고 변수 courses의 값이 1이 아닌 경우, 평가 값은 문자 ‘B’ (courses == 1) ? ‘A’ : ‘B’

3 조건 연산자의 연산 위 연산식을 다음과 같이 대입연산자와 함께 이용하면 이 연산식은 변수 courses의 값이 1일 경우, answer의 값에 A를 할당하고, 1이 아닌 경우는 B를 할당 즉 아래 문장에서는 대입 연산자의 우선순위는 가장 낮기 때문에 우선 순위가 그 보다 높은 조건 연산자를 먼저 계산하여 그 결과를 변수 answer에 저장하는 역할을 수행 courses 변수 값이 1인 경우 courses 변수 값이 2인 경우 answer = (courses == 1) ? ‘A’ : ‘B’

4 조건 연산자의 이용 다음 문장은 변수 x의 절대값을 변수 absolute에 저장하는 문장 물론 위 문장은 아래와 같은 의미
물론 위 문장은 아래와 같은 의미 다음 문장은 두 수 x, y 중에서 큰 수를 변수 max에 저장하는 문장 두 수 x, y 중에서 작은 수를 변수 min에 저장하는 문장 조건 연산자를 출력 함수에 이용하면 두 수 x, y 중에서 큰 수를 출력 absolute = (x < 0) ? -x : x ; absolute = (x >= 0) ? x : -x ; max = (x > y) ? x : y; min = (x > y) ? y : x; printf(“%d”, ((x > y) ? x : y));

5 조건 연산자 이용 조건 연산자의 예 조건연산자를 이용하는 경우, 대입연산자 =와 관계연산자 ==를 잘 구분하여 이용
위 소스에서 출력 값은 0이다. 만일 아래와 같이 관계연산자 ==를 이용한다면 출력값은 1 그러므로 관계연산자 ==를 대입연산자 =와 주의하여 사용 연산식 결과 값 3 > 4 ? 3 : 4 4 ‘a’ > ‘b’ ? 1 : 0 x>y ? x>y : !(x>y) 1 10>0 ? 10 : -10 10 10>1 ? 1 : 10 int a = 0; printf(“%d”, (a = 0) ? 1 : 0); int a = 0; printf(“%d”, (a == 0) ? 1 : 0);

6 예제 소스 Maxmin.c 두 수 중에서 큰 수를 출력하는 기능을 조건연산자를 이용하여 전처리기 지시자 #define으로 MAX 매크로 정의 #define MAX(x, y) ((x < y) ? y : x) 두 수 중에서 작은 수를 출력하는 조건연산자는 출력문에 기술 printf("%d\n", a < b ? a : b); 위 두 문장을 이용하여 변수 a, b에 각각 정수 값을 저장하여 큰 수와 작은 수를 출력하는 프로그램

7 비트 논리 연산자 비트 논리 연산자는 피연산자 정수 값을 비트 단위로 논리 연산을 수행하는 연산자
비트 논리 연산자는 &, |, ^, ~ 네 가지   비트 연산자 ^는 배타적 논리합(exclusive or) 연산자 피연산자의 비트 단위로 각각 0 또는 1로 구성되는 값의 비트 연산자의 결과는 다음과 같은 0이나 1의 비트 값의 결과를 구성 연산자 기호 의미 AND OR XOR NOT x & y x | y x ^ y ~x 연산자 왼쪽 값과 오른쪽 값의 비트 단위의 AND 연산 연산자 왼쪽 값과 오른쪽 값의 비트 단위의 OR 연산 연산자 왼쪽 값과 오른쪽 값의 비트 단위의 XOR 연산 단일 연산자로서 연산자 오른쪽 값의 비트 단위의 NOT 연산 x y AND 연산자 결과 OR 연산자 결과 XOR 연산자 결과 Not 연산자 결과 x & y x | y x ^ y !x 1

8 논리곱 비트 연산 비트 연산자는 0과 1만으로 구성된 이진수 각 자리에 대해 연산을 하며, 그 결과도 0 또는 1 예를 들어 비트 논리곱 연산자인 &는 두 수의 자릿수가 모두 1일 때만 1이고, 그 이외에는 0이 되는 연산을 수행 연산 3 & 5 피연산자인 3과 5를 각각 이진수로 표현한 각각의 비트를 and 연산으로 수행한 결과의 정수값이 평가값, 즉 1 연산 7 & 5 결과 ?

9 예제 소스 bitlogic.c 사용자 입력 정수 x와 y를 표준입력으로 두 개의 변수에 저장
두 개의 변수에 대하여 AND, OR, XOR, NOT 비트 연산을 수행한 결과를 다음 그림과 같이 출력하는 프로그램을 작성

10 오른쪽 이동 연산자(shift right)
이동연산자는 비트 단위로 왼쪽이나 오른쪽으로 이동시키는 연산자 C 언어에서는 다음 두 가지의 이동(shift) 연산자를 제공 연산자 기호 의미 왼쪽 이동 연산자(shift left) 오른쪽 이동 연산자(shift right) << >> 비트를 왼쪽으로 이동 비트를 오른쪽으로 이동

11 Shift left 7 << 2 위 연산은 좌변의 피연산자인 7의 이진수 표기 값을, 우변에 지정한 숫자만큼 왼쪽으로 옮기라는 연산을 의미

12 Shift right 7 >> 2 위 연산은 좌변의 피연산자인 7의 2진수 표기 값을, 우변에 지정한 숫자만큼 오른쪽으로 옮기라는 연산을 의미

13 비트 이동 연산의 주의 부호 비트의 처리 간편 계산
오른쪽 이동 연산자 >>는 비트 이동으로 비게 되는 왼쪽 비트들을 원래의 첫 번째 피연산자의 최상위 부호 비트로 채우는 것이 원칙 그러므로 unsigned int 형 정수인 경우는 왼쪽 상위 비트들이 모두 무조건 0으로 채움 다음은 signed int인 음수 -7을 오른쪽으로 2비트 이동 연산의 예로 그 결과는 -2 간편 계산 오른쪽 이동 연산자는 첫번째 피연산자가 양수인 경우 비트 이동을 한 번 할 때마다 첫 번째 피연산자를 2로 나누는 효과 a >> b 의 결과는 a / 2b (a가 양수인 경우) 왼쪽 이동 연산자는 비트 이동을 한 번 할 때마다 첫 번째 피연산자를 2로 곱하는 효과 a << b 의 결과는 a * 2b

14 예제 소스 shift.c 표준입력으로 입력 받은 사용자 입력 정수 두 개를 변수 x와 y에 저장
이 변수의 값을 피연산자로 이용해서 왼쪽, 오른쪽 이동 연산자의 수행 결과를 각각 적절하게 출력

15 측정 비트 값 알기 자료형 int 변수에 저장된 값 2를 모든 비트의 이진수로 표현하면
정수 값의 비트 내부 표현에서 특정한 비트의 값을 알아 내는 방법은 무엇일까? 즉 위 수에서 가장 오른쪽 최하위 비트를 쉽게 알 수 있는 방법을 생각 변수 a에 저장된 값의 최하위 비트의 값을 출력하는 소스 변수 mask를 이용하여 비트 논리 and 연산을 수행하는 과정 2(a) 1(mask) a & mask 변수 mask가 1인 경우, 조건식 (a & mask) ? 1 : 0은 비트 논리식 (a & mask)으로 기술해도 결과는 같으나 최하위 비트 뿐 아니라 원하는 특정 비트의 값을 알아내는 식으로 기술하기 위하여 이와 같은 조건식으로 기술 int a = 2; int mask = 1; printf(“%d”, (a & mask) ? 1 : 0);

16 비트 마스크 Bit mask 어떤 값에서 특정 비트의 값을 알려면
위에서 살펴보았듯이 그 해당 비트만 1, 그 외 모든 비트는 0을 갖는 마스크를 이용하여 비트 and 연산을 수행하면 결과를 얻음 정수 10의 최하위부터 4번째 자리의 비트 값을 알아내는 소스 변수 mask에는 최하위부터 4번째 자리의 비트 값만이 1인 8을 저장하여 사용 이 값을 직접 8을 기술하지 말고, 비트 이동 연산자를 이용하여 1 << 3으로 기술 가능 10(a) 8(mask) a & mask int a = 10; int mask = 8; // mask = 1 << 3; printf(“%d”, (a & mask) ? 1 : 0);

17 비트 마스크 특정 비트를 알아 내는 일반식 다른 비트 마스크
변수 a에 저장된 값의 최하위부터 n번째 자리의 비트 값을 알아내는 조건식 특정 값의 최하위부터 n번째 자리의 비트 값을 알아내는 마스크가 1<<(n-1) 다른 비트 마스크 원하는 특정 비트를 1로 지정하려면 해당 비트만을 1로 하는 마스크를 이용하여 비트 or 연산을 수행하면 결과를 얻는다. 원하는 특정 비트를 0으로 지정하려면, 해당 비트만을 1로 하는 마스크를 비트 부정하여 비트 and 연산을 수행하면 결과를 얻는다 원하는 특정 비트를 반대로 하려면 해당 비트만을 1로 하는 마스크를 이용하여 비트 xor 연산을 수행하면 결과를 얻는다 (a & (1<<(n-1))) ? 1 : 0

18 비트 마스크 정리 변수 a의 최하위부터 n번째 자리의 비트 연산식 의미 원하는 특정 비트를 알아 내려면
그 해당 비트만 1, 그 외 모든 비트는 0을 갖는 마스크를 이용하여 비트 and 연산을 수행 원하는 특정 비트를 1로 지정하려면 (a | (1 << n-1)) a |= (1 << n-1) 해당 비트를 1, 그 외 모든 비트는 0을 갖는 마스크를 이용하여 비트 or 연산을 수행 원하는 특정 비트를 0으로 지정하려면 (a & ~(1 << n-1)) a &= ~(1 << n-1) 해당 비트를 1, 그 외 모든 비트는 0을 갖는 마스크를 비트 부정하여 비트 and 연산을 수행 원하는 특정 비트를 반대로 하려면 (a ^ (1 << n-1)) a ^= (1 << n-1) 해당 비트를 1, 그 외 모든 비트는 0을 갖는 마스크를 이용하여 비트 xor 연산을 수행

19 예제 소스 bitmask.c 표준입력으로 입력 받은 양수 하나와 음수 하나의 최상위 비트의 값을 알아내는 프로그램을 작성
입력 정수는 int 형 변수에 저장하고, 마스크를 변수 mask에 저장 자료형 int는 개발도구에 따라 32비트나 16비트, 마스크를 적당히 이용 여기서는 32비트 이름로 1 << 31을 이용 mask = 1 << 31; // 1 << 15;

20 변수나 자료형의 크기 연산자 sizeof 우선 순위 변수나 변수형 또는 배열의 저장장소의 크기(바이트 단위)를 구하는 연산자
연산자 sizeof는 위와 같이 키워드 뒤에 자료형이나 변수명을 이용하여 사용하는데, int와 같은 자료형을 기술하는 경우 반드시 괄호를 이용 연산자 sizeof의 값은 실행 환경에 따라 달라질 수 있다. 왜냐하면 C 언어는 컴파일러마다 자료형에 따른 저장공간의 크기가 다르기 때문 우선 순위 연산자 sizeof는 단항 연산자로서 어떠한 이항 연산자보다 우선 순위가 빠름 sizeof (자료형) sizeof 변수명 int myAge = 10; printf(“%d\n”, sizeof myAge); printf(“%d\n”, sizeof (short));

21 예제 소스 sizeof.c 연산자 sizeof를 이용하여 int, long, float, double, char 변수형의 크기를 출력 자료형 int, long, float, double, char를 피연산자로 sizeof 연산의 결과를 출력

22 형 변환 통일된 자료형으로 연산 형 넓히기(promotion)
일반적으로 C 언어의 연산식에서 여러 피연산자의 자료형이 서로 다른 경우, 하나의 통일된 자료형으로 자동 변환하여 연산을 수행 표현의 크기가 작은 int 형 3을 4.0과 같은 double 형으로 변환하여 계산, 을 연산하여 결과는 7.0 형 넓히기(promotion) 형 넓히기는 크기가 작은 형을 크기가 큰 형으로 변환하는 것을 말하며 컴파일러에 의해 자동으로 실행될 수 있음

23 형 변환 연산자 형 좁히기 형 넓히기와는 반대로 형을 좁히려면 형 좁히기 (demotion)를 해야 하는데, 이 내림 변환은 일반적으로 형 변환 연산자를 이용하여 수행 그러나 다음과 같은 대입문에서는 컴파일러가 자동으로 내림 변환을 수행하여 변수 a에는 정수 값인 11만이 저장 대부분의 컴파일러는 이러한 내림 변환의 경우, 정보의 손실이 예상되므로 컴파일 중 경고를 발생 그러므로 가능하면 내림 변환에는 형 변환 연산자 이용을 권고 형 변환 연산자 피연산자의 값을 앞 위치의 괄호 안에서 지정한 자료형으로 변환하는 연산 int a = 11.4; (자료형) 피연산자 (int) 30.5

24 변환 연산의 이용 다음 소스에서 변수 Result의 값은 마지막 연산식이 다음이면 결과는 1.5
마지막 연산식이 다음이면 결과는 1.0 int X; int Y; double Result; X = 6; Y = 4; Result = (double)X / (double)Y; Result = (double)X / Y; Result = X / (double)Y; Result = X / Y;

25 예제 소스 Cast.c 자료형 double 형 변수 x, y에 각각 1.2와 1.9를 저장한 후 여러 더하기 연산 후, 결과 값을 출력

26 축약 대입 연산자 += 등 10가지 대입 연산자인 =와 산술 연산자인 +를 합쳐 놓은 듯한 연산자 +=을 축약 대입 연산자
축약 대입 연산자도 대입 연산자이므로 왼쪽 피연산자 부분에는 반드시 변수만이 올 수 있고, 연산의 의미도 대입 연산자인 =와 산술 연산자인 +를 합쳐 놓은 의미와 비슷하다. 축약 대입 연산자 x += y의 연산 방법은 변수 x 이전 값에다 오른쪽의 연산식 y에 의하여 평가된 결과 값을 연산(더하기)하여, 새롭게 수정된 값이 변수 x에 대입 축약 대입 연산자는 산술 이항 연산자와 비트 이항 연산자가 각각 대입연산자와 결합하여 구성 축약 대입 연산자 의미 x += y x = x + y x -= y x = x - y x *= y x = x * y x /= y x = x / y x %= y x = x % y x &= y x = x & y x |= y x = x | y x ^= y x = x ^ y x >>= y x = x >> y x <<= y x = x << y x += y 변수 += 연산식 x = x + y

27 축약 대입 연산자 이용 간편성 축약 대입 연산자는 소스를 간결히 하며, 긴 연산식보다 효율적인 소스를 작성
다음 주 문장은 같은 의미 대입 연산자의 우선 순위는 연산자 중에서 가장 낮아 오른쪽 수식을 모두 계산한 이후의 값을 x에 연산하여 그 값을 대입 그러므로 아래의 소스에서 x에는 19가 저장 즉 위 마지막 문장은 다음 문장을 의미한다. x = x + 3 * 4; x += 3 * 4; x = 3; y = 4; x += y + 3 * 4; x += x + (y + 3 * 4);

28 예제 소스 shortassign.c 사용자 입력 정수 x와 y를 표준입력으로 두 개의 변수에 저장 두 개의 변수에 대하여
+=, -=, *=, /=, %=의 산술 축약 대입 연산자와 &=, |=, ^=, <<=, >>= 비트 축약 대입 연산을 수행한 결과를 다음 그림과 같이 출력하는 프로그램을 작성

29 우선 순위 수학에서와 같은 우선 순위 수학에서도 곱하기나 나누기 연산자가 더하기나 빼기 연산자보다도 우선 순위가 더 높은 것처럼 C 언어에서도 연산자 사이에 우선 순위가 존재 우선 순위 연산자 계산 방향(결합법칙) 1 () [] . -> a++(후위) a–(후위) -> (좌에서 우로) 2 ++a(전위) –a(전위) ! ~ sizeof (형) -(단항) +(단항) &(주소) *(역참조, 간접) <- (우에서 좌로) 3 * / % 4 + - 5 << >> 6 < > <= >= 7 == != 8 & 9 ^ 10 | 11 && 12 || 13 ?: 14 = += -= *= /= %= <<= >>= &= |= ^= 15 ,(콤마 연산자)

30 주요 우선 순위 연산자의 주요 우선 순위 대입 < 조건 < 논리 < 비트 < 관계 < 이동 < 산술 < 단항 주요 단어 의미 괄호 괄호가 가장 우선순위가 높다. 따라서 연산의 우선 순위가 기억이 나지 않는다면 괄호를 사용해서 연산 우선권을 강제로 지정하는 것이 좋다. 단항 모든 단항 연산자는 어느 이항 연산자보다 먼저 계산한다. 이항 대입연산자를 제외한 모든 이항 연산자는 삼항 연산자인 조건 연산자(?:)보다 먼저 계산한다. 대입 콤마 연산자를 제외하고는 대입연산자를 제일 나중에 계산한다. 산술 산술연산자의 우선 순위가 관계 연산자나 논리 연산자보다 높다.

31 콤마 연산자 , 이용 연산자의 순위에서 가장 낮은 연산자는 콤마 연산자
콤마(쉼표) 연산자는 좌에서 우로 연산을 수행하며, 그 반환 값은 마지막에 수행한 연산의 결과 이용 int x; x = 3 + 4, ; //위 문장은 (x = 3+4), 5-10;을 의미하여 // x에는 7이 저장, 5-10은 의미 없는 구문 printf("%d\n", x); // 출력 값은 7 int x; x = (3 + 4, 5 – 10); //위 문장은 콤마 연산자를 먼저 수행해 5-10의 결과를 // x에 저장, 그러므로 -5가 x에 저장 printf("%d\n", x); // 출력 값은 -5

32 예제 소스 Priority.c 정수형 네 개의 변수에 다음을 저장하고, 여러 연산식의 결과를 알아보자.
예제 소스 Priority.c 정수형 네 개의 변수에 다음을 저장하고, 여러 연산식의 결과를 알아보자. int x = 3, y = 4, m = 6, n = 9;

33 프로그램 연습 프로그램 목적 구현 문자의 아스키 코드 값의 내부 표현을 이진수 그대로 출력하는 프로그램을 작성
문자 하나는 표준입력으로 받아 적당한 마스크를 이용하여 각각의 비트를 모두 출력하는 방법으로 처리 구현 문자 자료형인 char는 1바이트 8비트이므로, 8개의 8비트를 각각 구하여 출력 즉 변수 ch에 저장된 문자의 최상위 비트를 출력하려면 다음 소스를 이용 위와 같은 소스를 부분 수정하여 모두 8번 반복하면 8비트를 모두 출력 printf("%d ", (ch & (1 << 7)) ? 1 : 0);

34 소스와 결과


Download ppt "Chapter 07 비트와 여러 연산자."

Similar presentations


Ads by Google