본문 바로가기
프로그래밍/코딩

비트단위 연산자. &, |, ^, ~, <<, >>

by 눈야옹 2016. 4. 11.
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
void Study013::ChapterContents( void )
{
    printf_s("\tStudy013의 내용\n");
 
    // & AND연산 : 하나이상 0 이면 0 둘다 1이면 1
    // 0 & 0    return 0;
    // 0 & 1    return 0;
    // 1 & 0    return 0;
    // 1 & 1    return 1;
 
    int num1 = 15;    // 00000000 00000000 00000000 00001111
    int num2 = 20;    // 00000000 00000000 00000000 00010100
                    // 00000000 00000000 00000000 00000100
    int num3 = num1 & num2;
    printf("AND 연산 결과 : %d \n", num3); // AND 연산 결과 : 4
 
    // | OR연산 : 둘다 0이면 0 하나 이상1이면 1
    // 0 & 0    return 0;
    // 0 & 1    return 1;
    // 1 & 0    return 1;
    // 1 & 1    return 1;
 
    num1 = 15;    // 00000000 00000000 00000000 00001111
    num2 = 20;    // 00000000 00000000 00000000 00010100
            // 00000000 00000000 00000000 00011111
    num3 = num1 | num2;
    printf("OR 연산 결과 : %d \n", num3); // OR 연산 결과 : 31
 
    // ^ XOR연산 : 같으면 0 다르면 1
    // 0 & 0    return 0;
    // 0 & 1    return 1;
    // 1 & 0    return 1;
    // 1 & 1    return 0;
 
    num1 = 15;    // 00000000 00000000 00000000 00001111
    num2 = 20;    // 00000000 00000000 00000000 00010100
                // 00000000 00000000 00000000 00011011
    num3 = num1 ^ num2;
    printf("XOR 연산 결과 : %d \n", num3); // XOR 연산 결과 : 27
 
    // ~ NOT연산 : 0 과 1의 반전
    // ~ 0    return 1;
    // ~ 1    return 0;
    
    num1 = 15;        // 00000000 00000000 00000000 00001111
    num2 = ~num1;    // 11111111 11111111 11111111 11110000 
    printf("NOT 연산 결과 : %d \n", num2); // NOT 연산 결과 : -16
 
    // << 연산 : 비트단위로 왼쪽으로 이동
    // <<1 왼쪽으로 한칸이동
    // <<2 왼쪽으로 두칸이동
 
    num1 = 15;        // 00000000 00000000 00000000 00001111
    int result1 = num1 << 1// 왼쪽으로 한칸씩 이동 // 00000000 00000000 00000000 00011110
    int result2 = num1 << 2// 왼쪽으로 두칸씩 이동 // 00000000 00000000 00000000 00111100
    int result3 = num1 << 3// 왼쪽으로 세칸씩 이동 // 00000000 00000000 00000000 01111000
 
    printf("<< 연산 결과 : %d, %d, %d \n", result1, result2, result3); // << 연산 결과 : 30, 60, 120
 
    // >> 연산 : 비트단위로 오른쪽으로 이동
    // 이 연산의 경우 CPU마다 다를수가 있는데 음수를 유지하기 위해 1을 체우는 경우가 있고 그렇지 않은 경우가 있다.
 
    int num = -16;
    int result = num >> 2;
    printf(">> 연산 결과 : %d \n", result); // << 연산 결과 : -4
 
    //현제 CPU는 음의 부호를 유지한다.
 
}
 
cs