안녕하세요, 여행벌입니다.
오늘은 자바 비트 연산자에 대해서 다뤄보겠습니다.
비트 연산자
비트 연산자는 각각의 비트를 대상으로 연산을 진행하는 연산자이며 피연산자는 반드시 정수이어야 합니다. 실수를 대상으로 하는 비트 연산은 의미가 없기에 자바에서 지원하지 않습니다.
비트 연산자 : &, |, ^, ~
연산자 |
연산자의 기능 |
결합 방향 |
& |
비트 단위로 AND 연산을 한다. |
→ |
| |
비트 단위로 OR 연산을 한다. |
→ |
^ |
비트 단위로 XOR 연산을 한다. |
→ |
~ |
피연산자의 모든 비트를 반선시켜서 얻은 결과를 반환한다. |
← |
예제 1)
package Hello;
public class HelloWorld {
public static void main(String args[]) {
int a = 8; // 1000(2)
int b = 4; // 100(2);
System.out.printf("a & b : %d\n", a & b);
System.out.printf("a | b : %d\n", a | b);
System.out.printf("a ^ b : %d\n" , a ^ b);
System.out.printf("~a : %d" , ~a);
}
}
a는 8로 2진수로 표현하면 0000 0000 0000 0000 0000 0000 0000 1000(2)
b는 4로 2진수로 표현하면 0000 0000 0000 0000 0000 0000 0000 0100(2) 와 같습니다.
따라서, 비트 연산 & 를 진행하면 각 비트 별로 AND 연산이 진행되고,
0000 0000 0000 0000 0000 0000 0000 0000(2) 가 됩니다.
비트 연산 | 를 진행하면 각 비트 별로 OR 연산이 진행되고,
0000 0000 0000 0000 0000 0000 0000 1100(2) 가 됩니다.
비트 연산 ^ 를 진행하면 각 비트 별로 XOR 연산이 진행되므로
0000 0000 0000 0000 0000 0000 0000 1100(2) 가 됩니다.
비트 연산 ~ 를 진행하면 a의 각 비트를 0 이면 1, 1이면 0으로 바꾸므로
1111 1111 1111 1111 1111 1111 1111 0111(2) 가 됩니다.
따라서 결과는 0, 12, 12, -9가 됩니다.
a & b : 0
a | b : 12
a ^ b : 12
~a : -9
비트 쉬프트 연산자 : <<, >>, >>>
비트 쉬프트 연산자는 피연산자의 비트 열을 왼쪽 또는 오른쪽으로 이동시킨 결과를 반환하는 연산자입니다. 두 개의 피연산자가 필요한 이항 연산자이며, 피연산자는 모두 정수여야 합니다.
연산자 |
연산자의 기능 |
결합 방향 |
<< |
■ 피연산자의 비트 열을 왼쪽으로 이동 ■ 이동에 따른 빈 공간은 0으로 채움 |
→ |
>> |
■ 피연산자의 비트 열을 오른쪽으로 이동 |
→ |
>>> |
■ 피연산자의 비트 열을 오른쪽으로 이동 |
→ |
예시 2)
package Hello;
public class HelloWorld {
public static void main(String args[]) {
byte num = 2; // 00000010 (2)
System.out.println((byte)(num << 1)); //00000100(2)
System.out.println((byte)(num << 2)); //00001000(2)
System.out.println((byte)(num << 3)); //00010000(2)
num = 13; // 00001101 (2)
System.out.println((byte)(num >> 1)); // 00000110(2)
System.out.println((byte)(num >> 2)); // 00000011(2)
System.out.println((byte)(num >> 3)); // 00000001(2)
num = -8; // 11111000 (2)
System.out.println((byte)(num >> 1)); // 11111100(2)
System.out.println((byte)(num >> 2)); // 11111110(2)
System.out.println((byte)(num >> 3)); // 11111111(2)
}
}
4
8
16
6
3
1
-4
-2
-1
'Computer Language > JAVA' 카테고리의 다른 글
[JAVA] #8 자바 클래스, 메소드란 무엇인가 (1) | 2020.05.25 |
---|---|
[JAVA] 자바 랜덤 난수 생성 함수 정리 - travelbeeee (2) | 2020.03.31 |
[JAVA] #6 자바 단항 연산자 - travelbeeee (0) | 2020.03.17 |
[JAVA] #5 자바 이항 연산자 - travelbeeee (0) | 2020.03.16 |
[JAVA] #4 자바 형 변환 - travelbeeee (0) | 2020.03.13 |