& : 엠퍼센드(비트 AND)
| : 버티컬 바(비트 OR)
^ : 캐럿(XOR)
~ : 틸더(NOT)
<< : left shift
>> : right shift
연산 방법
&연산
비트 연산을 해서 양쪽이 전부 1인애들만 1, 나머지는 0으로 처리한다.
| 연산
or이므로, 둘중 1개만 1이여도 1로 연산
^(XOR) 연산
2개가 같으면 0 다르면 1을 내보낸다.
~연산
0을 1로, 1을 0으로 변경시켜준다.
양수의 경우 +1하고 -1을 곱한 결과와 같게 나온다.
<<, >> 연산
<<의 경우 2를 곱한 것과 같은 결과를 낸다.
>>의 경우 2로 나누고 소수점 이하를 버리는 효과
활용법
&와 |의 활용
- 자바, C등등의 언어에서는 논리연산과 동일하게 사용가능.
- &&,||와 달리 단축평가가 되지 않는다. 결과적으로 a,c의 값이 1증가되어 있는 것을 확인가능하다.
- ( &&,||는 앞이 false이면 뒤 과정을 진행하지 않음(단축). 그래서 a++이나 c++같이 증감이 일어나지 않는다. 그러나 &,|는 뒤과정까지 진행하므로)
주어진 정수의 홀짝 판별
- 일반적으로는 2로 나눈 나머지 확인
- &연산자 활용. &는 둘다 1일때만 1을 반환한다.
정수 | 1의 자리 | &1 연산시 |
홀수 | 1 | 1 |
짝수 | 0 | 0 |
그래서 &1결과가 1인지 보면 홀수임을 알 수 있다.
사용이유?
비트연산이 산술연산보다 일반적으로 빠르기 때문에, 성능이 중요하고 매우 많이 반복되는 작업일 경우,
성능을 높일 수 있겠다.
다만 요새는 상향평준화 되어있어, 성능테스트 후 선택하자.
^연산자의 활용 - 2개의 값을 서로 바꿔야 할 때.
- 보통의 경우 새 변수를 만들어서 임시로 값을 담아 둔다.
- ^(XOR)를 사용하게 되면 변수없이 사용가능
1. c = c^d ( c에 c와 d의 정보가 같이 들어가 있음)
2. d = d^c (d에 c,d합쳐놓은 c랑 ^연산을 하면 d 2개가 사라져서 c 정보만 남고, d의 값이 19에서 5로 변하게 됨)
3. c = c^d ( 아직 c는 c,d 합쳐진 그대로인데, d는 지금 5(c의 정보만 있음)이기 때문에 c,d에서 c 2개가 상쇄되서 사라지고 d인 19만 남음)
c는 19가 되고 d는 5가 된다.
변수하나를 덜 쓸 수 있기는 한데, 성능차이는 크진 않아서 참고만 하면 되겠다.
비트 마스킹
상황 : 모델마다
wifi
pen
Camera
SD Card
기능을 각각 지원하는지 여부를 데이터로 저장하기
자바스크립트 : 간편하게 객체 작성 가능
다른 언어 : 구조체나 클래스 사용
비트마스킹이면 해결 가능.
방법:
- 각 스펙을 자리수에 위치시켜서 1이면 해당 스펙을 갖춘것, 0이면 없는것으로 나타냄(shift연산자로 1칸씩 올려도 되고, 숫자로 16 이런식으로 해도 상관없을 듯.
- 해당 스펙을 가지고 있도록 한다면 | 연산자를 써서 전부 더해지게 하면 된다. PEN | SDCARD 이런식으로 사용하면 0010과 1000을 OR 연산해서 1010이 될 것이다.
- 그 스펙을 갖추었는지를 확인한다면 & PEN 이런식으로 AND 연산자를 사용해서 >0보다 큰지를 본다. 이러면 TRUE, FALSE로 판별할 수 있다.
기능 수정
^= : 0이면 1로, 1이면 0으로 토글할 때 유용. XOR의 특징을 살린 것.
'얄코의 제대로 파는 자바 > 섹션3' 카테고리의 다른 글
타입 추론 (0) | 2024.03.03 |
---|---|
문자열의 메소드들(하) (0) | 2024.03.01 |
문자열의 메서드들(상) (0) | 2024.02.28 |
문자열 자료형과 기초 사용법 (0) | 2024.02.21 |