Search

비트 연산자

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

피연산자를 비트단위로 논리 연산하는 연산자 | (OR) 피연산자 중 한 쪽 값이 1이면, 1을 결과로 반환. 그 외는 0 & (AND) 피연산자 중 양 쪽 모두 값이 1이면, 1을 결과로 반환. 그 외는 0 ^ (XOR) 피연산자 값이 서로 다를 때만 1을 결과 반환. 같을 때는 0
| : 주로 특정 비트 값을 변경할 때 사용
0xAB | 0xF = 0xAF // 10101011 | 00001111 = 10101111
Java
& : 주로 특정 비트 값을 뽑아낼 때 사용
0xAB & 0xF = 0xB // 10101011 & 00001111 = 00001011
Java
^ : 같은 값에 XOR 연산을 수행하면 원래 값으로 돌아오는 특징이라 간단한 암호화에 사용
0xAB ^ 0xF = 0xA4 // 10101011 ^ 00001111 = 10100100 0xA4 ^ 0xF = 0xAB // 10100100 ^ 00001111 = 10101011
Java
OperatorEx28.java

비트 전환 연산자 ~

피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꿈.
논리부정 연산자 !와 유사
부호가 있는 타입의 피연산자는 비트 전환되면 부호도 같이 바뀜.
0000101011110101 (10-11)
여기에 1을 더하면 1의 보수를 얻을 수 있음.
11110101 + 111110110 (-10)
비트 전환 연산자는 피연산자 타입이 int 보다 작으면 int 형으로 자동 산술 변환하기 때문에 실질적인 연산 결과는 32자리의 2진수가 됨.
0000000000000000000000000000101000000000000000000000000011110101
양의 정수에 p 대한 음의 정수를 얻고 싶을 때 → ~p+1
음의 정수 n에 대한 양의 정수를 얻고 싶을 때 → ~(n-1)
OperatorEx29.java

쉬프트 연산자 << >>

피연산자를 2진수로 표현했을 때 각 자리를 오른쪽 또는 왼쪽으로 이동시키는 연산자
8 << 2
0000100000100000
>> 연산자의 경우, 부호 있는 정수는 왼쪽 피연산자가 음수인 경우 빈자리를 1로 채움.
-8 >> 2
1111100011111110
쉬프트 연산 역시 피연산자 타입이 int 보다 작으면 int형으로 자동 산술 변환
타입 일치가 필요없는 우측 피연산자는 산술변환되지 않음.
2진수 n자리의 이동 결과
x << n == x * 2ⁿ x >> n == x / 2ⁿ
곳셈이나 나눗셈 연산자를 사용하면 되는데, 쉬프트 연산자를 사용하는 이유?
속도가 훨씬 빠르다! → 가독성이 떨어지더래도 빠른 실행 속도를 요구하는 곳에서 사용하자!
OperatorEx30.java
OperatorEx31.java

참고 자료