검수요청.png검수요청.png

시프트연산자

위키원
이동: 둘러보기, 검색

시프트 연산자(shift operator)는 비트 연산자 중 하나로 비트값을 왼쪽(<<) 또는 오른쪽(>>)으로 이동시키는 연산자이다. 연산자 중 '>>>'는 자바에만 있는 연산자로 부호를 신경쓰지 않는 것으로 비트 값들을 주어진 비트 수만큼 오른쪽으로 이동 시킨 후 왼쪽의 빈 공간을 모두 0으로 채운다.

개요[편집]

시프트 연산자
연산자 설 명
>> 비트값을 주어진 숫자만큼 오른쪽으로 이동시킨다.
<< 비트 값을 주어진 숫자만큼 왼쪽으로 이동시킨다.
>>> 비트 값을 주어진 숫자 만큼 오른쪽으로 이동 시킨 후 빈공간을 모두 0으로 채운다.

시프트연산자는 비트 값을 주어진 숫자만큼 부호 방향으로 이동시키는 연산자이다. 부호로는 '>>, <<, >>>'가 있다. 그 중 '>>>'는 자바에만 있는 연산자로 부호에 상관없이 비트 값들을 주어진 비트 수 만큼 오른쪽으로 이동시킨 후 빈 공간을 모두 0으로 채운다.

시프트 연산자 예시

특징[편집]

계산공식[편집]

시프트 연산의 특징은 왼쪽으로 비트 열을 이동하였을 경우에는 2의 배수의 곱이고, 오른쪽으로 비트 열을 이동했을 경우에는 2의 배수의 나눗셈이다. [1] 예시를 들자면 '10 << 1'라는 연산을 보면 10진수 정수인 10을 2진수로 바꾸어 왼쪽으로 2비트 움직이라는 말이다. 10진수를 2진수로 변환하면 '0000 1010'이다. 여기서 왼쪽으로 1비트 움직이면 '0001 0100'이되며, 다시 10진수로 변환하면 20이 되는 것을 알 수 있다. 여기에서 시프트 연산자의 계산 공식을 알 수 있게 된다. 10에서 20이 되는 걸 살펴보면 '10 * 2'라는 것을 알 수 있다. 여기서 2는 2^1라는 것을 유추할 수 있다. 즉 'x << n'은 'x * 2^n'이라는 공식이 성립하는 것을 알 수 있다.[2]

x << n = x * 2^n

주의사항[편집]

시프트 연산자 중 '>>>'에는 몇가지 주의점이 있다. 첫째, 연산 가능한 타입이 byte, short, int, long 타입과 char타입이 있는데 int보다 작은 비트 타입인 byte, short, char는 int로 변환되어 Shift가 된다. 그렇기 때문에 결과값을 int로 받지 않고 기존의 타입 그대로 받으면 문제가 발생하게 된다. 아래 문제발생 예시를 보면 -1 값을 가지는 byte 변수네 >>> 연산을 했는데 음수가 나오게 된다. [3]

[예제-문제발생]

   byte b = -1;
   b = b >>> 2; // error
   b = (byte)b >>> 2;

[계산과정]

   b = 1111 1111 1111 1111 1111 1111 1111 1111; // -1
   b >>> 2 = 0011 1111 1111 1111 1111 1111 1111 1111; // 1073741823 = 2^30-1
  (byte)b >>> 2 = 1111 1111; // -1, 위 결과의 오른쪽으로부터 8bit만 끊어서 캐스팅 

둘째, 비트 연산자의 피연산자 (A << B에서 B에 해당하는 부분) 그대로의 값으로 시프트 하는 것이 아니라 나머지 연산(%)의 결과값으로 시프트를 한다. [3]

[예제]

   int c = -1;
   c = c >>> 32;

[결과값]

   결과값은 32 % 32 = 0 이므로 아무런 시프트가 되지 않은 값으로, 똑같이 -1을 갖는다. byte 타입이면 % 8. short 타입이라면 % 16, long 타입이라면 % 64의 결과값으로 시프트 된다.

활용[편집]

[4] [코드]

   byte X = 5, Y = -3;
   System.out.println(X<<2);
   System.out.println(X>>3);
   System.out.println(X>>>4); 

[결과]

    1. 5 << 2 → 20
    2. 5 >> 3 → 0 
    3. 5 >>> 4 → 0

[코드]

   byte X = 5, Y = -3;
   System.out.println(Y<<2);
   System.out.println(Y>>3);
   System.out.println(Y>>>4);

[결과]

    1. -3 << 2 → -12
    2. -3 >> 3 → -1 
    3. -3 >>> 4 → 15(268435455) // int 이하의 자료형에서 시프트 연산 시 자동으로 int형 변수로 변환 됨.

[-값 계산 과정]

    1. -3 << 2 
     → 1111 1101
        1111 0100
    2. -3 >> 3 → -1 
     → 1111 1101
        1111 1111
    3. -3 >>> 4 → 15
     → 1111 1101
        0000 1111

각주[편집]

  1. 시프트 연산자 특징〉, 《시프트 연산자-시프트 연산자 종류, 비트연산의 특징》
  2. 시프트 연산자 계산공식〉, 2019-05-20《비트 연산자-시프트 연산자》
  3. 3.0 3.1 연산자 주의사항〉, 《자바의신 Vol.1 : 비트 시프트 연산자》, 2014-05-26
  4. 시프트 연산자 java코드〉, 《만들어가는 나의 공간》, 2017-07-19

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 시프트연산자 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.