5.비트 연산자(&, |, ^, ~, <<, >>, >>>)
-비트(bit)단위로 연산을 한다. 즉 0과 1이 피연산자가 된다.
● 0과 1로 표현이 가능한 정수 타입만 비트 연산을 할 수 있다.
● 실수 타입인 float과 double은 비트 연산을 할 수 없다.
-종류
● 비트 논리 연산자(&, |, ^, ~)
● 비트 이동 연산자(<<, >>, >>>)
첫번째 종류에 대해 알아봅시다.
-비트 논리 연산자(&, |, ^, ~)
● 피 연산자가 boolean타입일 경우 -> 일반 논리 연산자
● 피 연산자가 정수 타입일 경우 비트 논리 연산자
구분 | 연산식 | 결과 | 설명 | ||
AND (논리곱) |
1 | & | 1 | 1 | 두 비트가 모두 1일 경우에만 1이다 |
1 | 0 | 0 | |||
0 | 1 | 0 | |||
0 | 0 | 0 | |||
OR (논리합) |
1 | | | 1 | 1 | 두 비트 중 하나만 1이여도 1이다 |
1 | 0 | 1 | |||
0 | 1 | 1 | |||
0 | 0 | 0 | |||
XOR (배타적 논리합) |
1 | ^ | 1 | 0 | 두 비트 중 하나는 1 이고 다른 하나가 0 일 경우 1이다 |
1 | 0 | 1 | |||
0 | 1 | 1 | |||
0 | 0 | 0 | |||
NOT (논리부정) |
~ | 1 | 0 | 부정하다 (반대) | |
0 | 1 |
● 비트 연산자는 피연산자를 int타입으로 자동 타입 변환한 후 연산을 수행한다.
byte, short, char타입을 비트 논리 연산하면 그 결과는 int 타입이 된다.
다음은 컴파일 에러가 난다.
byte num1 = 45;
byte num2 = 25;
byte result = num1 & num2; //컴파일 에러 -> int result = num1 & num2;
public static void main(String[] args) {
System.out.println("45&25=" + (45 & 25));
System.out.println("45|25=" + (45 | 25));
System.out.println("45^25=" + (45 ^ 25));
System.out.println("~45=" + (~45));
System.out.println(toBinaryString(45));
System.out.println("&");
System.out.println(toBinaryString(25));
System.out.println("||");
System.out.println(toBinaryString(45&25));
}
public static String toBinaryString(int value) {
String str = Integer.toBinaryString(value);
while (str.length() < 32) {
str = "0" + str;
}
return str;
}
실행 후 결과 값:
45 & 25 = 9
45 | 25 = 61
45 ^ 25 = 52
~45 = -46
00000000000000000000000000101101
&
00000000000000000000000000011001
||
00000000000000000000000000001001
두번째 종류에 대해 알아봅시다.
-비트 이동(쉬프트) 연산자(<<,>>,>>>)
● 정수 데이터의 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산을 수행
구분 | 연산식 | 설명 | ||
이동 (쉬프트) |
a | << | b | 정수 a의 각 비트를 b만큼 왼쪽으로 이동 (빈자리는 0으로 채워진다) |
a | >> | b | 정수 a의 각 비트를 b만큼 오른쪽으로 이동 (빈자리는 정수 a의 최상위 부호비트(MSB)와 같은 값으로 채워진다) ※MSB : 양수는 0이고 음수는 1이다 |
|
a | >>> | b | 정수 a의 각 비트를 b만큼 오른쪽으로 이동 (빈자리는 0으로 채워진다) |
public class BitShiftExample {
public static void main(String[] args) {
System.out.println("1<<3= " + (1 << 3));
System.out.println("-8>>3= " + (-8 >> 3));
System.out.println("-8>>>3= " + (-8 >>> 3));
System.out.println();
System.out.println(toBinaryString(-8));
System.out.println(">>3=");
System.out.println(toBinaryString(-8 >> 3));
System.out.println();
System.out.println(toBinaryString(-8));
System.out.println(">>>3=");
System.out.println(toBinaryString(-8 >>> 3));
}
public static String toBinaryString(int value) {
String str = Integer.toBinaryString(value);
while (str.length() < 32) {
str = "0" + str;
}
return str;
}
실행 후 결과 값:
1<<3= 8
-8>>3= -1
-8>>>3= 536870911
11111111111111111111111111111000
>>3=
11111111111111111111111111111111
11111111111111111111111111111000
>>>3=
00011111111111111111111111111111
'자바공부 > 연산자' 카테고리의 다른 글
JAVA(자바) - 삼항 연산자(조건 연산식 ( (조건식) ? 값 또는 연산식 : 값 또는 연산식) (0) | 2021.01.19 |
---|---|
JAVA(자바) - 이항 연산자 6.대입 연산자(=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=) (0) | 2021.01.19 |
JAVA(자바) - 이항 연산자 4.논리 연산자(&&, ||, &, |, ^, !) (0) | 2020.12.30 |
JAVA(자바) - 이항 연산자 3.비교 연산자(==, !=, <, <=, >, >=) (0) | 2020.12.30 |
JAVA(자바) - 이항 연산자 2. 문자열 연결 연산자(+) (0) | 2020.12.23 |