2014년 9월 4일 목요일

Java 연산자(산술연산자-쉬프트연산자)

3.3 쉬프트 연산자

쉬프트 연산자는 정수형 변수에만 사용할 수 잇습니다. 피연산자의 각 자리(2진수로 표현했을 때)를 오른쪽 또는 왼쪽으로 이동(shift)한다고 해서 쉬프트 연산자라고 불린다. 오른쪽으로 n자리를 이동하면 피연산자를 2^n로 나눈 것과 같은 결과를, 왼쪽으로 n자리를 이동하면 2^n으로 곱한 것과 같은 결과를 얻습니다.

x << n은 x*2^n의 결과와 같다.
x >> n은 x/2^n의 결과와 같다

<<연산자의 경우, 피연산자의 부호에 상관없이 자리를 왼쪽으로 이동시키며 빈칸을 0으로 채우면 된다. >>연산자의 경우, 오른쪽으로 이동시키기 때문에 음수인 경우 부호를 유지시켜주기 위해서 음수인 경우 빈자리를 1로 채우면 된다. 반면에 >>>연산자의 경우, 부호에 상관없이 항상 0으로 빈자리를 채운다.
곱셈이나 나눗셈 연산자를 사용하면 같은 결과를 얻을 수 잇는데, 굳이 쉬프트 연산자를 제공하는 이유는 속도 때문입니다.
예를 들어 8>>>2의 결과는 8/4의 결과와 같지만, 8/4를 연산하는데 걸리는 시간보다 8>>>2를 연산하는데 걸리는 시간이 더 적게 걸립니다. 즉 << 또는 >>을 사용하는 것이 곱셈과 나눗셈 연산자 보다 더 빠릅니다.

public class Operator22
{

public static void main(String[] args) {

int number;
System.out.println(-8);
//-8진수를 2진수 문자열로 변경합니다.
System.out.println(Integer.toBinaryString(-8));
System.out.println();

number = -8 << 1;
System.out.println("-8 << 1 =" +number);
System.out.println(Integer.toBinaryString(number));
System.out.println();

number = -8 << 2;
System.out.println("-8 << 2 =" +number);
System.out.println(Integer.toBinaryString(number));
System.out.println();

System.out.println();
number = -8;
System.out.println(Integer.toBinaryString(number));
System.out.println();

number = -8 >> 1;
System.out.println("-8 >> 1 =" +number);
System.out.println(Integer.toBinaryString(number));
System.out.println();

number = -8 >> 2;
System.out.println("-8 << 1 =" +number);
System.out.println(Integer.toBinaryString(number));
System.out.println();

System.out.println();
number = -8;
System.out.println(Integer.toBinaryString(number));
System.out.println();

number = -8 >>> 1;
System.out.println("-8 >>> 1 =" +number);
System.out.println(Integer.toBinaryString(number));
System.out.println();

number = -8 >>> 2;
System.out.println("-8 >>> 2 =" +number);
System.out.println(Integer.toBinaryString(number));
System.out.println();

}
}

실행결과

-8
11111111111111111111111111111000

-8 << 1 =-16
11111111111111111111111111110000

-8 << 2 =-32
11111111111111111111111111100000


11111111111111111111111111111000

-8 >> 1 =-4
11111111111111111111111111111100

-8 << 1 =-2
11111111111111111111111111111110


11111111111111111111111111111000

-8 >>> 1 =2147483644
1111111111111111111111111111100

-8 >>> 2 =1073741822
111111111111111111111111111110

-8>>>1과 -8>>>2의 결과에서 맨 앞의 0은 생략된 것이다. Integer.toBinaryString(int i)는 정수 2진수 문자열로 변환할 때 앞부분의 0은 생락합니다.

댓글 없음:

댓글 쓰기