1. 비트 연산자
|
1
2
3
4
5
6
7
8
9
10
|
class Test
{
public satic void main(String[] args)
{
System.out.println(5&3); // 비트 & 연산자 (이항연산자)
System.out.println(5|3); // 비트 | 연산자 (이항연산자)
System.out.println(5^3); // 비트 ^ 연산자 (이항연산자)
System.out.println(~5); // 비트 ~ 연산자 (항이 1개. 단항연산자)
}
}
|
cs |
(1) 비트 AND 연산자 (&)
- 상위 비트와 하위 비트 둘 다 1일 때만 1이고 나머지는 다 0
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 1
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 1
↓& 연산자
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 0 1
(2) 비트 OR 연산자 ( | )
- 상위비트와 하위비트 둘 중에 하나만 1이어도 1, 둘 다 0이어야 0
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 1
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 1
↓ | 연산자
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 1 1
(3) 비트 XOR 연산자 ( ^ )
- 상위비트와 하위비트가 서로 같으면 0, 다르면 1
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 1
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 1
↓ ^ 연산자
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 1 0
(4) 비트 NOT 연산자 ( ~ )
- 1은 0으로, 0은 1로 반전 (1의 보수를 취한다랑 동일)
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 1
↓ ~ 연산자
1 ~~~~~~~~~~~~~~~ 1 1 1 1 1 0 1 0
2. 비트 연산자 예문
(1) 16과 7에 대한 ( &, |, ^, ~)
(2) 20과 5에 대한 ( &, |, ^, ~)
(3) 9와 4에 대한 ( &, |, ^, ~)
(4) 11가 6에 대한 ( &, |, ^, ~)
3. 왼쪽 비트 쉬프트 연산자 ( << )
- 2진수이기 때문에 왼쪽으로 1비트씩 옮길 때마다 2의 거듭제곱으로 커지는 효과가 있다.
2의 2진수 : 0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 0
1의 2진수 : 0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 0 1
(1) System.out.println(2<<1); // 4가 된다.
- 왼쪽으로 1비트 옮긴다는 뜻
- 이렇게 할 경우 최상위비트에 있던 0이 벗어나게 된다. 이렇게 벗어나는 비트는 버린다.
- 이렇게 벗어나는 비트는 버리고 비는 비트는 0으로 채운다.
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 0
↓ <<1
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 0
(2) System.out.println(2<<2); // 8이 된다.
- 왼쪽으로 2비트 옮긴다는 뜻.
- 이렇게 할 경우 최상위비트에 있던 0, 2개가 벗어나게 된다.
- 이렇게 벗어나는 비트는 버리고 비는 비트는 0으로 채운다.
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 0
↓ <<2
0 ~~~~~~~~~~~~~~~ 0 0 0 0 1 0 0 0
(3) System.out.println(2<<3); // 16이 된다.
- 왼쪽으로 3비트 옮긴다는 뜻.
- 이렇게 할 경우 최상위비트에 있던 0, 3개가 벗어나게 된다.
- 이렇게 벗어나는 비트는 버리고 비는 비트는 0으로 채운다.
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 0
↓ <<3
0 ~~~~~~~~~~~~~~~ 0 0 0 1 0 0 0 0
- 2를 왼쪽으로 1비트 옮기면 4, 2비트 옮기면 8, 3비트 옮기면 16이 된다.
(10진수를 왼쪽으로 1비트, 2비트, 3비트 옮기게 되면 10의 거듭제곱으로 커진다)
3. 오른쪽 비트 쉬프트 연산자 ( >> )
(1) System.out.println(8>>1); // 4가 된다.
- 오른쪽으로 1비트 옮긴다는 뜻.
- 이렇게 할 경우 최하위비트에 있던 0, 1개가 벗어나게 된다.
- 벗어나는 비트는 버리고, 부호비트를 유지하기 위해서 비는 비트는 양수면 0으로, 음수면 1로 채운다.
0 ~~~~~~~~~~~~~~~ 0 0 0 0 1 0 0 0
↓ >>1
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 0
(2) System.out.println(8>>2); // 2가 된다.
- 오른쪽으로 2비트 옮긴다는 뜻.
- 이렇게 할 경우 최하위비트에 있던 0, 2개가 벗어나게 된다.
- 벗어나는 비트는 버리고, 부호비트를 유지하기 위해서 비는 비트는 양수면 0으로, 음수면 1로 채운다.
0 ~~~~~~~~~~~~~~~ 0 0 0 0 1 0 0 0
↓ >>2
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 0
(3) System.out.println(8>>3); // 1이 된다.
- 오른쪽으로 3비트 옮긴다는 뜻.
- 이렇게 할 경우 최하위비트에 있던 0, 3개가 벗어나게 된다.
- 벗어나는 비트는 버리고, 부호비트를 유지하기 위해서 비는 비트는 양수면 0으로, 음수면 1로 채운다.
0 ~~~~~~~~~~~~~~~ 0 0 0 0 1 0 0 0
↓ >>3
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 0 1
- 8을 왼쪽으로 1비트 옮기면 4, 2비트 옮기면 2, 3비트 옮기면 1이 된다.
(4) System.out.println(-8>>1); // -4가 된다.
1 ~~~~~~~~~~~~~~~ 0 0 0 0 1 0 0 0
↓ >>1
1 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 0
(5)
System.out.println(8>>>1); //4가 된다.
- 8>>1의 경우 양수면 비는 비트를 0으로, 음수면 비는 비트를 1로 채웠지만
얘는 비는 비트를 무조건 0으로 채운다.
4. 비트 연산자 예문
int형 정수 15678의 오른쪽 세 번째 비트와 다섯 번째 비트가 각각 어떻게 되는지 확인하여 출력하기.
|
1
2
3
4
5
6
7
8
9
|
class Test
{
public static void main(String[] args)
{
int num = 15678;
System.out.println( (num>>2) &1 );
System.out.println( (num>>4) &1 );
}
}
|
cs |
- 구하고자 하는 자리의 비트를 최하위로 보내준 후 1과 비트 & 연산자를 해주었을 때 & 연산자의 특성으로 둘 다 1이어야 1, 아니면 0이 출력되기 때문에 구하고자 하는 자리의 비트도 1일 경우 1이 출력되며 구하고자 하는 자리의 비트가 0일 경우 0이 출력된다.
'Java > Day4' 카테고리의 다른 글
| [Java] 사용자 정의 메소드 & 예문 (0) | 2021.11.04 |
|---|---|
| [Java] 삼항 연산자 & short circuit evaluation (0) | 2021.11.04 |
| [Java] 데이터 타입. 자료형에 따른 연산 (0) | 2021.11.04 |
| [Java] switch case 구문 (0) | 2021.11.03 |