'연산자'에 해당되는 글 2건
- 2016.02.23 C언어 연산자에 대하여 - 비트연산
- 2016.02.23 C언어 연산자에 대하여
저번 포스트에 앞내용을 그대로 가져오겠습니다.
C언어 연산자.
C연어 연산자는 C언어의 아주 기초적인 내용입니다.
아주 기초적이기 때문에 소홀히 하기 쉬운 부분이기도 합니다.
C언어에서 연산자가 상당히 많은 중요한 역할을 하고 있다 할 수 있지만, 주목받지 못하는 이유는 이해 하기가 너무 쉽고, 소프트웨어 관련 프로그램에서는 문법보다 많은 비중을 차지하지 못하기 때문입니다.
그럼에도 연산자를 알아야 하는 이유는, 당연히 C언어 코딩 과정이 게임을 만드든, 뭘 만드든 연산자와 함수를 통해서 이루어지기 때문이죠.
특히, 비트연산자는 하드웨어와 관련된 신호를 처리할 때 도움이 되는 개념으로 꼭 알아야 합니다.
※ 연산자 종류
분류 |
연산자 |
대입 연산자 |
= |
산술 연산자 |
+, -, *, /, % |
복합 대입 연산자 |
+=, -=, *=, /=, %= |
증감 연산자 |
++, -- |
관계 연산자 |
>, <, ==, !=, >=, <= |
논리 연산자 |
&&, ||, ! |
조건 연산자 |
? : |
비트 논리 연산자 |
&, |, ^, ~ |
비트 이동 연산자 |
>>, << |
대입 연산자 부터 조건 연산자 까지는 이전 포스팅에서 작성 되었습니다.
http://silisian.tistory.com/35
◎ 비트 논리 연산자
비트 논리 연산자는 총 &, |, ^, ~ 4개를 가지고있습니다.
비트 논리 연산자 |
구분 |
& |
비트 곱 (AND) |
| |
비트 합 (OR) |
^ |
베타적 비트 합 (XOR) |
~ |
비트 부정 (NOT) |
◎ 비트 곱은 비트 라는 것을 제외하고 생각하면 곱셈연산과 같습니다. 단, 비트별로 곱합니다.
◎ 비트 합은 비트 라는 것을 제외하고 생각하면 덧셈연산과 같습니다. 단, 비트별로 덧셈하며 결과값은 참/거짓(1/0)으로만 표현합니다.
◎ 베타적 비트 합은 비트별로 연산하며 같으면 거짓을 다르면 참을 반환합니다. 비트별 != 연산이라 생각하면 간단합니다.
◎ 비트 부정은 Not연산이며, 비트 보수 연산자라고 불리기도 합니다. 자기자신의 비트별 !연산이라 생각하면 간단합니다.
◎ 비트 곱 (AND)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include<stdio.h> void main() { /* 비트 곱은 비트별로 연산 한다느넛만 빼면 논리 곱과 똑같습니다. A(1100) 과 B(1010)을 비트 곱 한다 하면 차례대로 1&1 = 1 (1*1 = 1) 1&0 = 0 (1*0 = 0) 0&1 = 0 (0*1 = 0) 0&0 = 0 (0*0 = 0) 이 나오게 됩니다. 오른쪽 처럼 생각하면 간단하죠? */ //예제 소스 char Data = 0x86; //16진수인 0x86은 2진법으로 표현하면 1000 0110 입니다. char BitMask = 0xf2; //16진수인 0xf2는 2진법으로 표현하면 1111 0010 입니다. char Result = Data & Bitmask; //이 2개의 수를 비트곱 연산을 하게되면, 값은 1000 0010이 나오게됩니다. // 즉 0x82가 나오게 됩니다. /* 연산 1 & 1 = 1 0 & 1 = 0 0 & 1 = 0 0 & 1 = 0 0 & 0 = 0 1 & 0 = 0 1 & 1 = 1 0 & 0 = 0 */ } | cs |
◎ 비트 합 (OR)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include<stdio.h> void main() { /* 비트 합은 비트별로 연산 한다는것만 빼면 논리 합과 똑같습니다. A(1100) 과 B(1010)을 비트 합 한다 하면 차례대로 1|1 = 1 (1||1 = 1) 1|0 = 1 (1||0 = 1) 0|1 = 1 (0||1 = 1) 0|0 = 0 (0||0 = 0) 둘중 하나라고 비트값이 1 이면 1을 반환합니다. 논리연산자중 ||을 생각해서 둘중 하나라고 참이면 참을 반환한다. 라고 생각하면 간단합니다. */ //예제 소스 char Data = 0x86; //16진수인 0x86은 2진법으로 표현하면 1000 0110 입니다. char BitMask = 0xf2; //16진수인 0xf2는 2진법으로 표현하면 1111 0010 입니다. char Result = Data | Bitmask; //이 2개의 수를 비트곱 연산을 하게되면, 값은 1111 0110이 나오게됩니다. // 즉 0xf6가 나오게 됩니다. /* 연산 1 | 1 = 1 0 | 1 = 1 0 | 1 = 1 0 | 1 = 1 0 | 0 = 0 1 | 0 = 1 1 | 1 = 1 0 | 0 = 0 */ } | cs |
◎ 베타적 비트 합 (XOR)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include<stdio.h> void main() { /* 베타적 비트 합은 비트별로 연산 한다는것만 빼면 논리연산자중 != 과 똑같습니다. A(1100) 과 B(1010)을 베타적 비트 합 한다 하면 차례대로 1^1 = 1 (1!=1 = 0) 1^0 = 1 (1!=0 = 1) 0^1 = 1 (0!=1 = 1) 0^0 = 0 (0!=0 = 0) 두개의 값이 서로 다르다면 1 같으면 0을 반환합니다. 논리연산자중 !=을 생각해서 둘이 다르다면 참을 반환 한다고 생각하면 간단합니다. */ //예제 소스 char Data = 0x86; //16진수인 0x86은 2진법으로 표현하면 1000 0110 입니다. char BitMask = 0xf2; //16진수인 0xf2는 2진법으로 표현하면 1111 0010 입니다. char Result = Data ^ Bitmask; //이 2개의 수를 비트곱 연산을 하게되면, 값은 0111 0100이 나오게됩니다. // 즉 0x74가 나오게 됩니다. /* 연산 1 ^ 1 = 0 0 ^ 1 = 1 0 ^ 1 = 1 0 ^ 1 = 1 0 ^ 0 = 0 1 ^ 0 = 1 1 ^ 1 = 0 0 ^ 0 = 0 */ //여기서 특이한점은, 베타적 비트합을 2번 연산 하게되면 원래 값으로 돌아가게 됩니다. Result = Result ^ Bitmask; // (0111 0100) ^ (1111 0010) = 1000 0110 //이처럼 XOR 즉 베타적 비트 합은 암호화의 자주 사용 됩니다. } | cs |
◎ 비트 부정 (NOT)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include<stdio.h> void main() { /* 비트 부정은 자기자신의 비트별로 연산 한다는것만 빼면 논리연산자중 ! 과 똑같습니다. 논리연산자중 앞에 !을 붙이면 참과 거짓이 바뀌듯 비트값앞에 !을 붙이게되면 비트의 0과 1이 바뀌게 됩니다. 따라서 A(1100)를 ~A 한다 하면 차례대로 ~1 = 0 ~1 = 0 ~0 = 1 ~0 = 1 1은 0으로 0은 1로 연산하게 됩니다. */ //예제 소스 char Data = 0x86; //16진수인 0x86은 2진법으로 표현하면 1000 0110 입니다. char Result = ~Data; //Data를 부정(~) 하게되면 0111 1001이 됩니다. // 즉 0x79가 나오게 됩니다. /* 연산 ~1 = 0 ~0 = 1 ~0 = 1 ~0 = 1 ~0 = 1 ~1 = 0 ~1 = 0 ~0 = 1 */ } | cs |
◎ 비트 이동 연산자
비트 이동 연산자는 총 << 과 >> 가지고있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include<stdio.h> void main() { /* 비트 이동 연산자는 비트의 위치를 왼쪽 또는 오른쪽으로 온긴다고 생각하면 됩니다. A(1101)를 B = A<<2; 라 하면 B의 값은 0100이 됩니다. A를 왼쪽으로 2번 쉬프트 하면 11 0100 이 됩니다. 하지만 범위를 초과한 비트는 버려지게 됩니다. 따라서 0100만 남아서 B의 값이 됩니다. ( A값은 변하지 않습니다. ) */ //예제 소스 char Data = 0x76; //16진수인 0x86은 2진법으로 표현하면 0111 0110 입니다. char Result01 = Data<<2; //Data를 <<2 하게되면 1101 1000이 됩니다. char Result02 = Data>>2; //Data를 >>2 하게되면 0001 1101이 됩니다. char Result03 = Data<<8; //Data를 <<8 하게되면 0000 0000이 됩니다. } | cs |
참고 자료 1 : https://ko.wikipedia.org/wiki/%EB%85%BC%EB%A6%AC_%EC%97%B0%EC%82%B0
참고 자료 2 : http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=598
참고 자료 3 : https://msdn.microsoft.com/ko-kr/library/336xbhcz.aspx
'프로그래밍 > Language' 카테고리의 다른 글
try, throw, catch 를 이용한 예외 처리 방법 (0) | 2016.02.23 |
---|---|
포인터에 대하여 (0) | 2016.02.23 |
C언어 연산자에 대하여 (0) | 2016.02.23 |
상수란 무엇인가? (0) | 2016.02.22 |
변수란 무엇인가? (0) | 2016.02.22 |
C언어 연산자.
C연어 연산자는 C언어의 아주 기초적인 내용입니다.
아주 기초적이기 때문에 소홀히 하기 쉬운 부분이기도 합니다.
C언어에서 연산자가 상당히 많은 중요한 역할을 하고 있다 할 수 있지만, 주목받지 못하는 이유는 이해 하기가 너무 쉽고, 소프트웨어 관련 프로그램에서는 문법보다 많은 비중을 차지하지 못하기 때문입니다.
그럼에도 연산자를 알아야 하는 이유는, 당연히 C언어 코딩 과정이 게임을 만드든, 뭘 만드든 연산자와 함수를 통해서 이루어지기 때문이죠.
특히, 비트연산자는 하드웨어와 관련된 신호를 처리할 때 도움이 되는 개념으로 꼭 알아야 합니다.
※ 연산자 종류
분류 |
연산자 |
대입 연산자 |
= |
산술 연산자 |
+, -, *, /, % |
복합 대입 연산자 |
+=, -=, *=, /=, %= |
증감 연산자 |
++, -- |
관계 연산자 |
>, <, ==, !=, >=, <= |
논리 연산자 |
&&, ||, ! |
조건 연산자 | ?: |
비트 논리 연산자 | &, |, ^, ~ |
비트 이동 연산자 | >>, << |
◎. 대입 연산자는 오른쪽 값을 왼쪽으로 넣는것을 말합니다. 관계 연산자인 ==과 대입 연산자는 = 헷갈릴 수 있으므로 주의할것.
◎. 복합 대입 연산자는 왼쪽값에 오른쪽 값을 산술후 대입하는걸 말합니다. a+=1; 은, a에 1을 먼저 더하고(산술) 후에 값을 다시 a에 대입합니다
◎. 증감 연산자에 선 연산 후 증감, 선 증감 후 연산으로 나뉩니다. ++a 와 a++의 차이점을 알아두세요!
◎. 관계 연산자는 2개의 값을 비교할떄 사용합니다. 결과값은 1 또는 0 즉 참 또는 거짓으로 반환됩니다.
◎. 논리 연산자는 참과 거짓을 연산자에 맞춰서 연산하여 결과값을 1 또는 0 즉, 참 또는 거짓을 반환합니다.
◎. 조건 연산자는 관계연산자로 나온 결과값에 따라 반환값을 달리합니다.
◎. 대입 연산자
1 2 3 4 5 6 7 8 | #include<stdio.h> void main() { int a; a = 1; // 대입 연산자 } | cs |
오른쪽 값을 왼쪽으로, 자료형에서 자동형변환이 일어날 때도 오른쪽에서 왼쪽순이었다.
◎. 복합 대입 연산자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include<stdio.h> void main() { int a; a = 0; //대입 연산자 //복합 대입 연산자 a += 1; //( a = a+1) a -= 1; //( a = a-1) a /= 1; //( a = a/1) a *= 1; //( a = a*1) } | cs |
오른쪽값과 왼쪽값을 연산해서 왼쪽에 넣는다.
◎. 증감 연산자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include<stdio.h> void main() { int a; int b = 0; int c = 0; a = 0; //대입 연산자 //증감 연산자 a++; // a = a+1 a--; // a = a-1 //앞뒤의 차이 a = 1; b = ++a; // 증감 연산자가 앞에 있다면 선 연산후 대입 즉 a에 +1이 되며 b에는 2값이 들어간다. c = a++; // 증감 연산자가 뒤에 있다면 선 대입후 연산 즉 c에는 2값이 들어가며 a는 3이 된다. } | cs |
◎. 관계 연산자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include<stdio.h> void main() { int a = 1; int b = 0; //관계 연산자 // >, <, ==, !=, >=, <= //참이면 1반환 거짓이면 0을 반환한다. int result =0; result = a<b ; //a가 b보다 작다. 거짓 result값 0 result = a>b ; //a가 b보다 크다. 참 result값 1 result = a==b ; //a와 b가 같다. 거짓 result값 0 result = a!=b ; //a와 b가 같지않다.참 result값 1 result = a>=b ; //a가 b보다 크거나 같다. 참 result값 1 result = a<=b ; //a가 b보다 작거나 같다. 거짓 result값 0 } | cs |
◎. 논리 연산자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include<stdio.h> void main() { int a = 1; int b = 0; //논리 연산자 //&&, ||, ! //논리 연산자는 참과 거짓을 연산자에 맞춰서 연산하여 결과값을 1 또는 0 즉, 참 또는 거짓을 반환합니다. int result = 0; //&&연산자, And 연산자 result = a == b && a>b; // a 와 b가 같으면서 a가 b보다 크다 / 거짓 result값 0 result = a != b && a>b; // a 와 b가 같지않으면서 a가 b보다 크다 / 참 result값 1 //||연산자, Or 연산자 result = a == b || a>b; // a 와 b가 같거나 a가 b보다 크다 / 참 result값 1 //a==b는 거짓이여도. a>b가 참이기에 or연산자는 참을 반환한다. result = a == b || a<b; // a 와 b가 같거나 a가 b보다 작다 / 거짓 result값 10 //a==b는 거짓ㅣ며. a<b도 거짓이기에 or연산자는 거짓을 반환한다. //!연산자, Not 연산자 result = !(a>b); // a가 b보다 크다 의 값은 참이나, !가 있기에 반대값인 거짓을 반환한다. result값 0 result = !(a<b); // a가 b보다 작다 의 값은 거짓이나, !가 있기에 반대값인 참을 반환한다. result값 1 } | cs |
◎. 조건 연산자
실제로 if문때문에 잘 쓰이지 않는.. 불쌍한 연산자..
알맞게 사용한다면 코드가 간결해지고, 난무한다면 가독성이 떨어진다는 전설의 연산자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include<stdio.h> void main() { int a = 1; int b = 0; //조건 연산자 // ? : // 관계연산자로 나온 결과값에 따라 반환값을 달리합니다. // 사용법 // (조건)? (참):(거짓); // ?앞에있는 조건의 반환값에 따라 (참) 또는 (거짓)을 실행시키거나 반환한다. // 예제 int result = 0; result = (a>b)? 10 : -10; //a>b의 값이 참이므로 :기준 왼쪽 값을 대입하여, result값은 10이 된다. result = (a==b)? 10 : -10; //a==b의 값이 거짓이므로 :기준 오른쪽 값을 개입하며 result값은 -10이 된다. //또한 이렇게 함수 자체를 넣을수도있습니다. (a<=b)? printf("a<=b는 참입니다") : printf("a<=b는 거짓입니다"); //물론 위의 값은 a<=b가 거짓이므로 : 기준 오른쪽 인 printf("a<=b는 거짓입니다")가 실행되게 됩니다. } | cs |
.◎. 비트 연산자
비트 연산자는 내용이 길어 질수있기 때문에,
다음 포스팅에서 작성하겠습니다.
참고 : http://baeseonha.tistory.com/category/C-programing/C%EC%96%B8%EC%96%B4%20%EA%B8%B0%EC%B4%88
'프로그래밍 > Language' 카테고리의 다른 글
포인터에 대하여 (0) | 2016.02.23 |
---|---|
C언어 연산자에 대하여 - 비트연산 (0) | 2016.02.23 |
상수란 무엇인가? (0) | 2016.02.22 |
변수란 무엇인가? (0) | 2016.02.22 |
#Pragma의 사용법 (0) | 2016.02.22 |