[Java] 비트(Shift) 연산자 사용법 & 예제
- Language/Java
- 2020. 4. 19.
비트 연산자는 데이터를 비트 단위로 연산합니다. 그러므로 0과 1로 표현이 가능한 정수 타입이나 정수형으로 캐스팅이 가능한 자료형만 비트 연산이 가능합니다. 비트 연산자는 기능에 따라 비트 이동연산자, 비트 논리연산자로 구분합니다.
비트 이동 연산자(<<. >>, >>>)
연산식 | 설명 |
x << y | 정수 x의 각 비트를 y만큼 왼쪽으로 이동시킵니다. (빈자리는 0으로 채워집니다.) |
x >> y | 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킵니다. (빈자리는 정수 a의 최상위 부호비트와 같은 값으로 채워집니다. |
x >>> y | 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킵니다. (빈자리는 0으로 채워집니다.) |
비트 이동 연산자는 정수 데이터의 비트를 왼쪽 또는 오른쪽으로 이동시키는 연산을 합니다.
2 << 3
2<< 3 은 2를 32비트로 분해한다음 왼쪽으로 3비트를 이동시키는 연산입니다. 비트를 왼쪽으로 3비트 이동할때 맨 왼쪽 3비트는 밀려서 버려지게되고 맨 오른쪽에는 0으로 채워집니다. 2진수로 표현된 2을 왼쪽으로 3칸이동시키면 16이됩니다.
16 >> 3
-16 >> 3
16 >> 3 은 16을 32비트로 분해한다음 오른쪽으로 3비트를 이동시키는 연산입니다. 비트를 오른쪽으로 3비트 이동할때 맨 오른쪽 3비트는 밀려서 버려지게되고 맨 왼쪽에는 최상위 부호비트와 동일한 값으로 채워지게 됩니다. 즉 피 연산자가 음수라면 빈공간은 1로 채워지게되고 양수라면 0으로 채워집니다. 2진수로 표현된 16을 오른쪽으로 3칸이동시키면 좌측에는 0이 채워지게 되어 2가되고 -16을 오른쪽으로 3칸이동시키면 좌측에는 1이 채워지게 되어 -2가 됩니다.
-16 >>> 3
>>> 연산은 오직 자바에만 있는 연산이며 >>와 기본원리는 같습니다. 비트를 오른쪽으로 3비트 이동할때 맨 오른쪽 3비트는 밀려서 버려지게됩니다. 하지만 >> 연산과는 다르게 맨 왼쪽에는 최상위 부호비트와 관계없이 무조건 0으로만 채워지게됩니다. 앞자리가 0으로만 채워지기에 결과값은 무조건 양수로만 나타나게 됩니다.
예제
System.out.println("2 << 3 = " + (2<<3));
System.out.println("16 >> 3 = " + (16>>3));
System.out.println("-16 >> 3 = " + (-16>>3));
System.out.println("-16 >>> 3 = " + (-16>>>3));
비트 논리 연산자(&, |, ^, ~)
연산자 | 논리 | 설명 |
& | AND | 두 비트 모두 1일 경우에만 연산 결과가 1 |
| | OR | 두 비트 중 하나만 1일 경우에만 연산결과가 1 |
^ | XOR | 두 비트중 하나는 1이고 다른 하나가 0일경우에만 연산결과가 1 |
~ | NOT | 비트 반전(보수) |
비트 논리 연산자는 그 대상이 boolean타입일 경우에는 일반 논리 연산자로 활용되지만 대상이 정수형일 경우에는 위의 표와 같이 비트 논리연산자로 활용됩니다. 비트 연산은 두 값을 비트 단위로 나열한 뒤 각 자릿수를 비트 연산자로 연산합니다. 각 자릿수의 연산은 독립적이며 다른 자릿수에 영향을 주지 않습니다.
& (AND연산)
&연산(논리곱)은 2진수로 표현된 2개의 피연산자를 AND연산 하여 결과를 나타냅니다. 2진수로 표현된 두 비트가 모두 1일 경우에만 연산결과가 1로 표현됩니다.
| (OR연산)
|연산(논리합)은 2진수로 표현된 2개의 피연산자를 OR연산 하여 결과를 나타냅니다. 2진수로 표현된 두 비트 중 하나가 1일 경우에만 연산결과가 1로 표현됩니다.
^ (XOR연산)
^연산(배타적 논리합)은 2진수로 표현된 2개의 피연산자를 XOR연산 하여 결과를 나타냅니다. 2진수로 표현된 두 비트 중 하나는 1이고 다른 하나가 0일경우에 연산결과가 1로 표현됩니다.
~ (보수)
~연산(논리부정)은 이진수로 표현된 피연산자의 값을 반전(보수)시켜주어 표현합니다.
예제
System.out.println("15 & 25 = " + (15 & 25));
System.out.println("15 | 25 = " + (15 | 25));
System.out.println("15 ^ 25 = " + (15 ^ 25));
System.out.println("~25 = " + (~25));
'Language > Java' 카테고리의 다른 글
[Java] 자바 this의 의미와 사용법 (12) | 2020.04.21 |
---|---|
[Java] 열거 타입(Enum) 사용법 & 예제 (0) | 2020.04.20 |
[Java] 자바로 폴더(디렉토리),파일 이동시키기 / 잘라내기 (1) | 2018.12.28 |
[Java] 자바로 폴더(디렉토리),파일 복사하기 (1) | 2018.12.27 |