본문 바로가기
얄코의 제대로 파는 자바/섹션3

비트연산자

by 백엔드 개발자 2024. 3. 3.

& : 엠퍼센드(비트 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. 각 스펙을 자리수에 위치시켜서 1이면 해당 스펙을 갖춘것, 0이면 없는것으로 나타냄(shift연산자로 1칸씩 올려도 되고, 숫자로 16 이런식으로 해도 상관없을 듯.
  2. 해당 스펙을 가지고 있도록 한다면 | 연산자를 써서 전부 더해지게 하면 된다. PEN | SDCARD 이런식으로 사용하면 0010과 1000을 OR 연산해서 1010이 될 것이다.
  3. 그 스펙을 갖추었는지를 확인한다면 & 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