[Java의 정석] 비트 연산자

말하는 감자·2023년 11월 16일
0

Java의 정석

목록 보기
29/32
post-thumbnail

Chapter 03 연산자(Operator)

5. 논리 연산자

📌 비트 연산자 & | ^ ~ << >>

비트 연산자는 피연산자를 비트단위로 논리 연산한다.
피연산자라를 이진수로 표현했을 때의 각 자리를 아래의 규칙에 따라 아래의 표와 같이 연산을 수행하며, 피연산자로 실수를 허용하지 않는다. 정수(문자 포함)만 허용된다.

| (OR연산자) 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
& (AND연산자) 피연사자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
^ (XOR연산자) 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.

📍비트 전환 연산자 ~

이 연산자는 피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꾼다. 논리부정 연산자!와 유사하다.

비트 전환 연산자~에 의해 '비트 전환'되고 나면, 부호있는 타입의 피연산자는 부호가 반대로 변경된다. 즉, 피연산자의 '1의 보수'를 얻을 수 있는 것이다. 그래서 비트전환연산자를 '1의 보수'연산자라고도 한다.

📍쉬프트 연산자 << >>

이 연산자는 피연산자의 각 자리(2진수로 표현했을 때)를 '오른쪽(>>)' 또는 '왼쪽(<<)'으로 이동(shift)한다고 해서 '쉬프트 연산자(shift operator)'라고 이름 붙여졌다.
8 << 2는 왼쪽 피연산자인 10진수 8의 2진수를 왼쪽으로 2자리 이동한다.

x << nx * 2^n의 결과와 같다.
x >> nx / 2^n의 결과와 같다.

곱셈이나 나눗셈 연산자를 사용하면 같은 결과를 얻을 수 있는데, 굳이 쉬프트 연산자를 제공하는 이유는 무엇일까? 그 이유는 속도 때문이다.
예를 들어 8 >> 2의 결과는 8 / 4의 결과와 같다. 하지만 8 / 4를 연산하는데 걸리는 시간보다 8 >> 2를 연산하는데 걸리는 시간이 더 적게 걸린다. 다시 말하면 >> 또는 <<연산자를 사용하는 것이 나눗셈/ 또는 곱셈*연산자를 사용하는 것 보다 더 빠르다.
그러나 프로그램의 실행속도도 중요하지만 프로그램을 개발할 때 코드의 가독성(readability)도 중요하다. 쉬프트 연산자가 속도가 빠르긴 해도 곱셈이나 나눗셈 연산자보다도 가독성이 떨어질 것이다. 쉬프트 연산자보다 곱셈 또는 나눗셈 연산자를 주로 사용하고, 보다 빠른 실행속도가 요구되어지는 곳만 쉬프트 연산자를 사용하는 것이 좋다.


📑 원본 자료

  • Java의 정석(3판) [남궁 성/도우출판/2016]
profile
나는 말하는 감자다

0개의 댓글