반응형
자바(java) - 쉬프트 연산자
1. >> (산술적 오른쪽 쉬프트)
비트를 오른쪽으로 이동시킨다. 이때, 가장 오른쪽에 위치한 비트는 유지한다.
가장 오른쪽에 위치한 비트는 십진수로 변환했을 때의 부호를 의미하기 때문에, 산술적 오른쪽 쉬프트는
변수의 부호를 유지한다고 할 수 있다.
byte a = (byte) 0b00110011;
byte b = (byte) (a >> 2); // b = 0b00001100
byte a = (byte) 0b10110011;
byte b = (byte) (a >> 2); // b = 0b11101100
산술적 오른쪽 쉬프트를 시행할 때마다 10진수로 변환한 값이 2로 나눠진다.
2. << (산술적 왼쪽 쉬프트)
비트를 왼쪽으로 이동시킨다. 가장 왼쪽에 위치한 비트는 0으로 채운다.
byte a = (byte) 0b00110011;
byte b = (byte) (a << 2); // b = 0b11001100
산술적 왼쪽 쉬프트를 시행할 때마다 10진수로 변환한 값에 2가 곱해진다.
3. >>> (논리적 오른쪽 쉬프트)
비트를 오른쪽으로 이동시킨다. 이때, 가장 오른쪽에 위치한 비트는 0으로 채운다.
byte a = (byte) 0b10110011;
byte b = (byte) (a >>> 2); // b = 0b00101100 일 것으로 기대
위와 같은 연산이 되는 것을 기대했지만 사실 저 코드를 실제로 실행해보면 b는 십진수로 -20이 나온다.
a가 연산될 때 자동으로 형변환되어 int형이 되기 때문이다.
즉 연산 과정에서 a는 1111 1111 1111 1111 1111 1111 1011 0011 로 형변환되고 그 후 쉬프트 연산하면
a = 0011 1111 1111 1111 1111 1111 1110 1100 이 된다.
반응형