본문 바로가기

프로그래밍(코딩)/C언어

C언어 독학하기-(8) 시프트 연산자와 비트 연산자

반응형

'C언어 독학하기-(8) 시프트 연산자와 비트 연산자'

 

 

지난 글에서 C언어의 산술 연산자, 증감 연산자, 비교 연산자, 논리 연산자를 정리했었다면, 이번에는 C언어에서 제공하는 시프트 연산자와 비트 연산자에 대해 정리해보도록 하겠습니다. 전문적으로 C언어 프로그래밍을 하기 위해서 꼭 알고 가면 유용하게 쓰일 내용들이 많았기 때문에 집중해서 정리해보도록 하겠습니다.

 

 



 

<10-1 비트 단위 연산과 비트 패턴>

 

 

 

비트 : 0 또는 1을 저장할 수 있는 공간

 

C언어에서 제공하는 자료형의 최소 단위 = 1바이트 = 8비트

 

 

 

(0과 1로 자료를 저장할 수 있는 프로그램을 만들 때, 비트 단위로 연산한다면 메모리를 절약할 수 있다.)

 

 

 

출처: 네이버 지식백과

 

C언어는 2진법 상수 표현 제공 X -> 2진법으로 변환하기 쉬운 16진법을 이용

 

 

 

 

 

unsigned char data = 0x5A;

 

 

▲ 1바이트 data 변수 선언 -> 16진수 값 5A로 초기화

 

(16진수를 표시할 때는 앞에 0x를 반드시 붙여야 한다.)

 

 

 

data = 0101(5) 1010(A)   ( * ( )가 16진수 )

 

16진수 한 자리 = 4비트

 

(1바이트 data 변수는 4자리씩 나누어 2진법으로 표현)

 

 

 

 

 

16진수 0x5A의 비트 패턴

 

오른쪽에서 왼쪽으로 갈수록 비트 번호가 커진다.

 

 

 


 

<10-2 시프트 연산자>

 

 

 

시프트 연산자 : 변수의 값을 지정한 비트 수만큼 왼쪽 또는 오른쪽으로 비트를 이동시킨다. (<<, >>)

 

 

 

 

 

시프트 연산자 (=오버플로)

 

<오른쪽에서 왼쪽으로 이동>

 

(변수 << 이동할 비트 수)

 

비트가 왼쪽으로 이동해서 사라지는 것 = '오버플로'

 

 

 

 

 

시프트 연산자 (=언더플로)

 

<왼쪽에서 오른쪽으로 이동>

 

(변수 >> 이동할 비트 수)

 

비트가 오른쪽으로 이동해서 사라지는 것 = '언더플로'

 

 

 

 

 

10진수와 2진수 비트 패턴 나열 표

 

<< 연산 : 2^n을 곱한 것과 같은 효과

>> 연산 : 2^n을 나눈 것과 같은 효과

 

 

 

곱셈, 나눗셈에 비해 시프트 연산은 속도가 빠름.

2의 제곱으로 곱할 때, 나눌 때는 시프트 연산이 효율적이다. (2의 제곱 이외의 숫자는 대체 불가능)

 

 

 

 

 

<시프트 연산자를 사용 시, 주의할 점>

 

* 연산자 우선 순위가 낮다

 

Ex)

3 * 4 + 5 * 8

3 << 2 + 5 << 3 (X)

(3 << 2) + (5 << 3) (O)

 

 

 

* 변수 부호 여부

 

unsigned char가 아닌 signed char로 선언한 변수일 경우,

 

최상위 비트가 부호 비트(0이면 양수, 1이면 음수)가 된다.

 

또한 시프트 연산(>>) 시, 자신의 부호를 유지하기 위해 해당 부호 비트 값을 빈 공간에 채운다.

 

(음수를 다루는 경우, "나누어지는 숫자가 나누는 숫자의 배수인지 체크 후 사용" 혹은 "기존 나눗셈 방법 사용")

 

 

 


 

<10-3 비트 연산자>

 

 

 

비트 연산자 : 비트 단위로 AND(&), OR(|), NOT(~), XOR(^) 연산을 수행한다.

 

 

 

비트 연산자 (AND, OR, XOR, NOT 연산) 예시

 

 

 

 

 

 

 

두 값을 비트 단위로 연산하며,

 

- A 비트가 0일 경우 B 비트에 상관없이 0이 된다.

- A 비트가 1이면 B 비트의 값에 따라 0 또는 1이 된다.

 - A, B 비트가 모두 1일 경우, 1이 된다.

 

 

 

 

 

 

두 값을 비트 단위로 연산하며,

 

- A 비트가 1이면 B 비트에 상관없이 1이 된다.

- A 비트가 0이면 B 비트의 값에 따라 0 또는 1이 된다.

- A, B 비트 중 하나라도 1이면 1이 된다.

 

 

 

 

 

 

두 값을 비트 단위로 연산하며,

 

- 연산하는 A, B 비트 값이 서로 같으면 0, 서로 다르면 1이 된다.

 

 

 

 

 

 

하나의 값을 비트 단위로 연산하며,

 

- 해당 비트가 0이면 1이 되고, 1이면 0이 된다.

 

 

 

 

 

비트 연산자 단축 표현

 

 

 



 

 

 

이렇게 C언어 프로그래밍에서 사용되는 시프트 연산자와 비트 연산자에 대해 정리해보았습니다. 확실히 기존 내용들에 비해 조금은 어려운 부분이였기 때문에 시간이 조금 걸렸으나 확실히 알고 가면 나중에 큰 도움이 될 것 같습니다.

 

 

 

 

 

© 2021. 달팽이멘토 all rights reserved

 

 

 

 

 

추천하는 글

 

 

C언어 독학하기-(7) C언어 반복문에 대하여

'C언어 독학하기-(7) C언어 반복문에 대하여' 저번 글에 이어서 이번에는 C언어 반복문의 종류와 코드 예시를 살펴보고, 반복문과 함께 사용되는 break문과 continue문 개념에 대해 정리해보도록 하겠

anywhereifyoucan.com

 

 

메타버스 가상 부동산 플랫폼 '어스2 (Earth2)' 땅 구입 방법 알아보기

'메타버스 가상 부동산 플랫폼 '어스2(Earth2)' 땅 구입 방법 알아보기' 요즘 블록체인 기술을 바탕으로 한 코인, NFT, P2E 등 여러 분야로 발전되고 있는데요, 그 중에서 오늘 알아볼 어스2라는 플랫

anywhereifyoucan.com

 

반응형