'연산자'에 해당되는 글 2건

  1. 2016.02.23 C언어 연산자에 대하여 - 비트연산
  2. 2016.02.23 C언어 연산자에 대하여
2016. 2. 23. 07:58

저번 포스트에 앞내용을 그대로 가져오겠습니다.


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
C언어 연산자에 대하여  (0) 2016.02.23
상수란 무엇인가?  (0) 2016.02.22
변수란 무엇인가?  (0) 2016.02.22
Posted by 시리시안

댓글을 달아 주세요

2016. 2. 23. 06:52

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
C언어 연산자에 대하여  (0) 2016.02.23
상수란 무엇인가?  (0) 2016.02.22
변수란 무엇인가?  (0) 2016.02.22
#Pragma의 사용법  (0) 2016.02.22
Posted by 시리시안

댓글을 달아 주세요