210903, C언어 입문 - day 6

Min Hyeok·2021년 9월 3일
0

C언어 개념 익히기

목록 보기
6/19

안농. 또 내가 왔다.

오늘은 잡담은 각설하고 바로 복습할 내용이나 쓰겠다. 왜냐고? 그냥 빨리 끝내고 놀게. 그리고 좀 detail하게 공부해야 할 내용이라..

10장, Shift 연산자와 bit 연산자

우선, 비트 단위 연산자가 왜 필요한가에 대해서 알아보겠다.

우리가.. 아니 내가 여러 프로그램을 만들어 본다고 가정했을 때, 프로그램 안엔 이런 저런 기능들이 있을거다. 예로 들면, 내 옆에 있는 이 스탠드를 키고 끈다고 가정하면, 이 스탠드는 "켜진 상태", "꺼진 상태", 두가지의 상태가 있다. 근데 1바이트(8bit)로 표현하기엔 쓸모없이 저장 공간이 많지 않나? 1bit에는 2진수인 0과 1이 들어가는데, 그러면 0(꺼짐), 1(켜짐)으로 set하면 충분히 1비트로도 설명이 가능한 것 같은데?

이렇게, 메모리 절약을 위해서 비트 단위 연산이 필요하다.

그 다음, 시프트 연산자.

시프트(shift). 옮기다 / 이동하다라는 뜻을 가지고 있다. 말 그대로임. 이동 연산자. 앞서 언급해준 비트를 좌측 / 우측으로 이동시키는 기능을 한다.

예를 들자면

unsigned char data1, data2;
data1 = 0x01;
data2 = 0x04;

data1 = data1 << 3; /** 0000 1000 이 된다 **/
data2 = data2 >> 1; /** 0000 0010 이 된다 **/

이렇게, 된다는 거다. 그런데 만약 내가 1110 0001 (0xE1)을 좌로 1비트 옮긴다면, 가장 일곱번째 자리에 있는 비트'1'은 어떻게 될까?

답은, 사라진다. 이 경우를 overflow (오버플로)라고 함. 대신에 우측에 비는 (empty) 자리에는 0으로 채워진다.

그리고 여기서 주의해야할 특성이 있는데, 만약 비트가 있는 문자형이라면? 예를 보자.

char A = 0x32; /** 10진수로 50 **/
A = A >> 3;

위와 같은 사례라면, 0x32 (1011 0010)에서 맨 앞에 부호비트1은 어떻게 되냐 이거지. 심지어 우측으로 가니까..

이런 경우에는 앞의 사례처럼 overflow의 반대인 underflow(언더플로)가 발생한다고 하는데, 우측에 있는 비트는 사라진다. 근데 왼쪽에서 새로 생겨나는 비트들은 원래 있던 부호비트와 같은 애들이 생긴다.
위의 코드 예시로 들면 1011 0010 > 1111 0110이 된다는거지.

그리고 시프트 연산자는 연산자 우선순위가 낮아서 좀 주의해줘야 한다. 심지어 덧셈, 뺄셈보다 낮으니까. 주의해줘야 할 필요가 있다. 소괄호를 쳐줘서 우선순위를 올려야함.

그 다음, 비트 연산자.

뭐 논리 연산자인 AND(&), OR(|), XOR(^), NOT(~)이 있다. 근데 일반적인 논리연산자와의 차이점이라하면 비트 연산자는 기호를 하나만 써준다는거. 이건 주의하자.

그리고 비트 단위로 코드를 만지기 시작하면서 비트 단위로 데이터를 다루는 방법을 배우게 되는데, 여기부터 좀 의문이 생기기 시작한다. 뭐 덧셈 코드 짜는 이런애들이랑은 레벨이 좀 다른거지.

책에 있는 예시들로 가자.

우선, 지정한 비트를 0으로 SET.

#include <stdio.h>

unsigned char zero_set(unsigned char og, unsigned char bit_num) {
	
    og &= ~(0x01 << bit_num); /** ~으로 인해, 1111 1101 **/
    return og; /** zero_set 함수의 결과값은 og다! **/
    
}

int main() {

	unsigned char state = 0xB7; /** 0xB7 = 1011 0111 **/ 
    state = zero_set(state, 1); /** 1번째 비트를 0으로 바꿀거야**/
    printf("result is %x\n", state);
    return 0;
    
}
    

해석은 알아서 해보자.

그럼 두번째, 지정한 비트를 1로 SET.

#include <stdio.h>

unsigned char one_set (unsigned char og, unsigned char bit_num) {
	
    og |= 0x01 << bit_num;
    return og;
    
}

int main() {
	
    unsigned char state = 0xB7;
    state = one_set(state, 3);
    printf("result is %x\n", state);
    return 0;
    
}

요정~도. 어느정도 손에 익었나보다. 오늘은 요정도만 하고, 11장 공부는 오늘 했지만 내일 복습하겠다. 다음날 복습하는게 기억에 좀 더 오래 나을듯.

여기까지

0개의 댓글