Computer Science/C

C언어 7강 | Bitwise operators

토마토. 2021. 12. 17. 14:55

중요한 부분 : enum, bit로 출력하기, 

 

Bitwise operation

bitwise logical operator

complement : ~

AND : &

OR : |

XOR : ^

 

// example

#include <stdio.h>

int main()
{
	unsigned char num1 = 1; //0000 0001
    unsigned char num2 = 3; //0000 0011
    
    printf("%d\n", num1&num2); // 0000 0001
    printf("%d\n", num1|num2); // 0000 0011
    printf("%d\n", num1^num2); // 0000 0010
    
    return 0;
}

 

 

bitwise shift operator

left shift : <<

right shift : >>

shift 연산자는 두번째 피연산자가 정하는 위치 만큼 첫번째 피 연산자를 왼쪽(<<) 혹은 오른쪽(>>)으로 이동시킨다. 

unsigned int x, y, z;

x = 0x00AA;
y = 0x5500;

z = (x<<8) + (y>>8); // 0XAA55

 

 

operator precedence & association

<< >> & ^ |

 

two's complement

뺄셈에 필요함

-n : 비트 연산자를 적용하고, 1을 더한다. 

(앗 2의 보수)

(모든 자리의 숫자를 반전시키고, 1을 더하면 된다)

[Programming] 2의 보수 계산하는 방법, Two's Complement (tistory.com)

 

masks

원하는 비트를 추출하기 위한 상수

원래의 binary sequence와 비교대조용 시퀀스를 만들어서

그것을 마스크처럼 씌워 원하는 비트를 추출한다. 

#include <stdio.h>
#
int main()
{
	unsigned short data =0x5678;
    unsigned short msk1 =0xf000;
    unsigned short msk2 =0x0f00;
    unsigned short msk3 =0x00f0;
    unsigned short msk4 =0x000f;
    
    printf("결과1 = %#.4x\n", data&msk1); // 0x5000
    printf("결과1 = %#.4x\n", data&msk2); // 0x0600
    printf("결과1 = %#.4x\n", data&msk3); // 0x0070
    printf("결과1 = %#.4x\n", data&msk4); // 0x0008

	return 0;
}

 

printing an int bitwise

#include <limits.h>
void bit_print(int a){
    int i;
    int n = sizeof(int) * CHAR_BIT;
    int mask=1<<(n-1);

    for (i=1;i<=n;++i){
        putchar(((a&mask)==0)?'0':'1');
        a<<=1;
        if (i%CHAR_BIT==0&&i<n){
            putchar(' ');
        }
    }
}

 

packing and unpacking

 

 

enumeration types

열거형 type enum

0 1 2 등 상수 대신 Sun 등 의미가 담긴 identifier를 상수 대신 사용할 수 있다.

 

사용법

step 1. enum 선언

enum day {Sun, Mon, Tue, Wed, Thur ,Fri, Sat};

step 2. day로 변수 생성

day next_day;

step 3. 변수로 상수 대신 활용

next_day = Mon;

full version

#include <stdio.h>

enum day {Sun, Mon, Tue, Wed, Thur, Fri, Sat};
typedef enum day day;
    
int main(void){
    find_next_day(Mon);
   	return 0;
}

day fine_next_day(day d){
	day next_day;
    next_day = (day)((int)d + 1) % 7;
    return next_day;
}

형 변환 주의!