관리 메뉴

History

시프트 연산자와 비트연산자 step_2 본문

C,C++/개념 실습 프로그래밍

시프트 연산자와 비트연산자 step_2

luckybee 2022. 11. 19. 19:47
728x90
반응형

*시프트 연산자의 기능

 

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

 

예시는 아래 코드와 같다.

 unsigned char data= 0x1A; //변수 << 이동할 비트 수 -> 오른쪽에서 왼쪽 이동
 //이동 전-> 0001 1010
 data= data<<2; //2칸을 오른쪽에서 왼쪽으로 밀겠다
 //이동 후-> 0110 1000
 unsigned char data= 0x1A; //변수 >> 이동할 비트 수 -> 왼쪽에서 오른쪽으로 이동
 //이동 전-> 0001 1010
 data= data>>2; //2칸을 왼쪽에서 오른쪽으로 밀겠다
 //이동 후-> 0000 0110

위의 예시처럼 이동한 비트들이 할당된 메모리의 크기를 벗어나면 해당 비트들은 사라지고 비트가 이동한 빈자리에는 0이 채워진다. 

 

비트가 왼쪽으로 이동해서 사라지는 것을 오버플로(overflow)

비트가 오른쪽으로 이동해서 사라지는 것을 언더 플로(underflow)

 

라고 부른다.

 

*시프트 연산자의 특성 이용하기

위의 표는 10진수로 이루어진 숫자와 그 숫자에 대한 비트 패턴을 2진수로 나열한 표이다.

 

이 표에서 1이 왼쪽으로 1칸씩 이동할 때마다 2를 곱한 만큼 숫자가 커지고, 오른쪽으로 1칸씩 이동할 때마다 2를 나눈 만큼 숫자가 작아진다. 

 

결론

<< 연산을 이용하여 n개의 비트를 오른쪽에서 왼쪽으로 이동하면 2^n을 곱한 것과 같다.

>> 연산을 이용하여 n개의 비트를 왼쪽에서 오른쪽으로 이동하면 2^n을 나눈 것과 같다.

 

ex)

data=data<<3;라는 코드가 있으면 data*2^3한 것과 같다.(*8)

data=data<<1;라는 코드가 있으면 data*2^1 한 것과 같다.(*2)

data=data>>2;라는 코드가 있으면 data/2^2한 것과 같다.(/4)

 

이렇게 제곱을 시프트 연산자로 하는 이유는 곱셈이나 나눗셈 연산은 속도가 느리기 때문이다. 하지만 모든 곱셈과 나눗셈을 시프트 연산자로 대체할 수는 없다. 왜냐하면 2의 제곱수만큼 곱하고 나누기 때문에 5, 6, 7과 같은 숫자들은 곱하거나 나눌 때에는 일반 연산자를 사용할 수밖에 없다.

 

*시프트 연산자를 사용할 때 조심해야 할 점

 

1. 시프트 연산자의 우선순위가 덧셈보다 낮기 때문에 ()를 통해서 제어해주지 않으면 일반적인 사칙연산을 계산했을 때 엉뚱한 결과값을 도출할 수 도 있다.

 

2. 변수에 부호가 있으면 최상위 부호 비트에 따라서 음수일 경우에 원하는 결과값이 안 나올 수 있다. 예를 들어 최상위 비트가 1인 상태이고, >> 3 밀었으면 3만큼 언더 플로가 발생하게 되고, 최상위 비트부터 3칸이 1로 채워진다.

 

p.s) 부호 비트가 0이면 양수 1이면 음수이다.

 

 

728x90
반응형
Comments