- 급 관심이 생겨서..
& | ^ ~ << >>
- & : AND
- | : OR
- ^ : XOR
- ~ : NOT
- << : LEFT
- >> : RIGHT
int x = 5; // 0 0 1 0 1
int y = 19; // 1 0 0 1 1
1. & -> AND
int x = 5; // 0 0 1 0 1
int y = 19; // 1 0 0 1 1
int x_and_y = 5 & 19; // 0 0 0 0 1 -> 1
- 양쪽 모두 1인 것들만 1로, 나머지는 0으로
2. | -> OR
int x = 5; // 0 0 1 0 1
int y = 19; // 1 0 0 1 1
int x_or_y = 5 | 19; // 1 0 1 1 1 -> 23
- 값중에 하나만 1이여도 1, 나머지는 0
3. ^ -> XOR
int x = 5; // 0 0 1 0 1
int y = 19; // 1 0 0 1 1
int x_xor_y = 5 ^ 19; // 1 0 1 1 0 -> 22
- 양쪽의 값이 다르면 1, 같으면 0
4. ~ -> NOT
int x = 5; // 00000000 00000101
int y = 19; // 00000000 00010011
int notX = ~5; // 11111111 11111010 notX: -6
int notY = ~19; // 11111111 11101100 notY: -20
- 양쪽 정수에 1을 더한 다음 -1을 곱한 것과 같은 결과
- 0을 1로, 1을 0으로
5. <<, >>
int x = 5; // 0 0 1 0 1 x: 5
int x_L_1 = 5 <<1; // 0 1 0 1 0 xLeft1: 10
int y = 19; // 0 1 0 0 1 1 y: 19
int y_L_1 = 19 << 1; // 1 0 0 1 1 0 yLeft1: 38
- << : 왼쪽으로 자리수를 이동
- 0 0 1 0 1
- 0 1 0 1 0
- 각각 2를 곱한 값이 나옴
int x = 5; // 0 0 1 0 1 x: 5
int x_L_1 = 5 >> 1; // 0 0 0 1 0 x_R_1: 2
int y = 19; // 0 1 0 0 1 1 y: 19
int y_L_1 = 19 >> 1; // 0 0 1 0 0 1 y_R_1: 9
- >>: 오른쪽으로 자리수를 이동
- 0 1 0 0 1 1
- 0 0 1 0 0 1
- 2로 나눈 다음 소수점 이하를 버린 결과
이걸 어디다가 씀?
int a = 1, b = 1;
int c = 1, d = 1;
boolean bool1 = a > b && a++ > b;
boolean bool2 = c == d || c ++ == d;
boolean bool3 = a > b & a++ > b;
boolean bool4 = c == d | c++ == d;
- 뭔차이?
- 단축 평가(short-circuit evaluation)이 되지 않음
- 첫번째 bool1을 계산해볼 때 가정해보자(bool2도 동일)
- a 는 b보다 크지 않다(같다) false
- 앞의 계산이 false이니 뒤의 a++ > b는 계산을 안 해봐도 된다
- &&는 뒤의 ++a가 수행이 되지 않는다. (콤퓨타 답다)
- bool3, bool4
- 동일하게 수행되나 단축 평가가 되지 않아
- a++, c++가 수행되게 된다.
- 즉, boolean 값이 무엇이든 간에 실행해야 하는 연산이 있으면 사용하는게 좋다.!
별로 필요 없는거 같은데?
1. 주어진 정수가 홀인지 짝인지 알아볼 때 쓰인다(홀짝 코테 첨 배울때 어려운!~)
int a = 3;
int b = 15;
int c = 4;
int d = 20;
for (int i : new int[]{a,b,c,d}) {
if ((i % 2) == 1) System.out.println(i + "는 홀수 입니다.");
if ((i & 1) == 1) System.out.println(i + "는 홀수 입니다.");
}
- 일반적으로 널리 사용되는 방법: 2로 나눈 나머지를 보는 것
- 1이 남으면 홀수, 나누어떨어져 0이 남으면 짝수
- 비트연산자 &를 사용하면?
- 홀수는 이진법에서 첫 자리가 1로 나온다.
- 3 -> 0 1 0 1
- 15 -> 1 1 1 1
- 1과 함께 &로 연산하면 홀수는 모두 1로
- 짝수는 0으로 연산이 되는 것! (& -> 둘다 1이면 1, 아니면 0)
- 왜씀?
- 성능이 차이가 난다. (근소하게)
2. SWAP
int a = 5;
int b = 19;
int temp = a;
a = b;
b = temp;
- 일반적인 swap 방법
int c = 5; // 0 0 1 0 1
int d = 19; // 1 0 0 1 1
c ^= d; // c: 1 0 1 1 0
d ^= c; // d: 0 0 1 0 1
c ^= d; // c: 1 0 0 1 1
3. 비트마스킹
int WIFI = 1; // 0 0 0 1 WIFH: 1
int PEN = 1 << 1; // 0 0 1 0 PEN: 2
int CAMERA = 1 << 2; // 0 1 0 0 CAMERA: 4
int SDCARD = 1 << 3; // 1 0 0 0 SDCARD: 8
int tablet_1 // tablet_1: 14
= PEN | SDCARD; // 1 0 1 0
int tablet_2 // tablet_2: 12
= WIFI | CAMERA | SDCARD; // 1 1 0 1
boolean t1_HasPen = (tablet_1 & PEN) > 0; // t1_HasPen: true
boolean t1_HasCamera = (tablet_1 & CAMERA) > 0; // t1_HasCamera: false
boolean t2_HasWifi = (tablet_2 & WIFI) > 0; // t2_HasWifi: true
boolean t2_HasPen = (tablet_2 & PEN) > 0; // t2_HasPen: false
- 비트 마스킹과 비트 연산을 사용하여 여러 장치를 나타내는 상태를 표현하고 확인하는 간단한 예를 보여줌
- WIFI, PEN, CAMERA, SDCARD 변수
- WIFI는 이진으로 1로 표현되어 있으며, 0 0 0 1
- PEN는 2번 비트가 1로 설정되어 있으며, 0 0 1 0
- CAMERA는 3번 비트가 1로 설정되어 있으며, 0 1 0 0
- SDCARD는 4번 비트가 1로 설정되어 있으며, 1 0 0 0
- tablet_1 변수
- tablet_1은 PEN과 SDCARD를 비트 OR 연산으로 결합한 것
- tablet_1의 값은 0 0 1 0 | 1 0 0 0 = 1 0 1 0이 되어, 10진수로는 14
- tablet_2 변수
- tablet_2는 WIFI, CAMERA, 그리고 SDCARD를 비트 OR 연산으로 결합한 것
- tablet_2의 값은 0 0 0 1 | 0 1 0 0 | 1 0 0 0 = 1 1 0 1이 되어, 10진수로는 12
- t1_HasPen 변수:
- t1_HasPen은 tablet_1과 PEN을 비트 AND 연산하여 1 0 1 0 & 0 0 1 0 을 계산한 결과
- 0 0 1 0 으로 0보다 크다 -> true
- t1_HasCamera 변수:
- t1_HasCamera는 tablet_1과 CAMERA를 비트 AND 연산하여 0 0 1 0 & 0 1 0 0을 계산한 결과
- 이 연산의 결과가 0이므로 t1_HasCamera은 false
- t2_HasWifi 변수:
- t2_HasWifi는 tablet_2와 WIFI를 비트 AND 연산하여 1 1 0 1 & 0 0 0 1을 계산한 결과
- 연산의 결과가 1이므로 t2_HasWifi은 true
- t2_HasPen 변수:
- t2_HasPen은 tablet_2와 PEN을 비트 AND 연산하여 1 1 0 1 & 0 0 1 0을 계산한 결과
- 연산의 결과가 0이므로 t2_HasPen은 false
정리를 해봤는데 비트마스킹은 좀 어려운거 같다.!
곰곰히 생각해보면 이해가 될 것이다. ! 시프트 연산에 OR연산으로 더해준다음 &연산으로 존재하는지 존재하지 않는지 확인
'CS지식들 > 공부공부' 카테고리의 다른 글
git stash (0) | 2024.08.25 |
---|---|
Object (Java) (0) | 2023.11.05 |
도커로 개발환경 세팅하기 (0) | 2023.04.07 |
회원 가입 로직 구현 (1) | 2023.03.09 |
인증(Authentication) 관련 Exception을 제어하는 기능 구현 (0) | 2023.03.09 |