비트 연산자

비트 연산자

생성일
Oct 14, 2024 05:21 PM
최종 편집 일시
Last updated October 24, 2024
태그
CS

비트 연산자란?

이진수의 각 비트에 대해 연산을 수행하는 연산자.
숫자들이 컴퓨터에서 이진수로 표현되기 때문에, 비트 연산을 통해 효율적으로 값을 처리할 수 있다.
비트 연산은 각 비트를 하나하나 계산하는 방식이므로, 매우 빠르고 메모리 효율적인 방법이다.
 

종류

1. & (AND 연산자)

두 숫자의 대응되는 비트가 둘 다 1일 때 1을 반환한다. 나머지는 0을 반환한다.
5 & 3
이 있다면 5는 이진수로 0101, 3은 이진수로 0011 이 둘을 & 연산하면 0001이 된다.
5 & 3 ⇒ 1이 되는 것이다.

2. | (OR 연산자)

두 숫자의 대응되는 비트가 둘 중 하나라도 1이면 1을 반환한다.
5 | 3
이 있으면 0101 | 0011 하면 0111이 된다.
5 | 3 ⇒ 7 이다.

3. ^ (XOR 연산자)

두 숫자의 대응되는 비트가 서로 다를 때 1을 반환한다. 즉, 하나는 1이고 다른 하나는 0일 때 1을 반환한다.
5 ^ 3
0101 ^ 0011 하면 0110 이 된다.
따라서 5 ^ 3 ⇒ 6 이다.

4. ~ (NOT 연산자)

숫자의 비트를 반전한다. 즉, 1을 0으로 0을 1로 바꾼다.
컴퓨터에서 숫자는 보통 32비트 또는 64비트로 표현되기 때문에 모든 비트를 뒤집은 결과가 나온다.
~5
32비트를 다 생각해줘야 한다. 0101 이라고 위에서 표현한 건 32비트 하에서 마지막 4자리가 0101인 것이다.
따라서 원래 5는
00000000 00000000 00000000 00000101
NOT 연산을 하게 되면
11111111 11111111 11111111 11111010 ⇒ -6이 된다.
** 보수 체계 **
음수 표현은 어떻게 하는걸까?
음수는 양수의 이진수를 NOT연산으로 반전한 후 1을 더해 표현한다.
따라서 -5를 이진수로 표현하려면 ~5 + 1을 해야 한다.
그 결과는 11111111 11111111 11111111 11111011 이 된다.
~5는 1을 더하기 이전의 결과이기 때문에 -6이 된다.
~6을 해보면 어떻게 나올까
00000000 00000000 00000000 00000110
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010 ⇒ -6

5. << (왼쪽 시프트 연산자)

숫자의 비트를 왼쪽으로 지정된 횟수만큼 이동시킨다.
오른쪽에서 빈 공간은 0으로 채워진다.
왼쪽으로 시프트하면 숫자가 2의 배수만큼 커진다.
5 << 1
00000000 00000000 00000000 00001010
맨 마지막 101을 왼쪽으로 1비트 옮기고 오른쪽 빈공간은 0으로 채우면 위와 같이 변한다.
따라서 결과는 10이 된다.

6. >> (오른쪽 시프트 연산자)

숫자의 비트를 오른쪽으로 지정된 횟수만큼 이동시킨다. 왼쪽에서 빈 공간은 부호에 따라 0 또는 1로 채워진다.
** 오른쪽 시프트 연산자는 양수일 때와 음수일 때 결과가 다르다. **
가장 왼쪽의 비트가 부호비트이다.
*양수인 경우
오른쪽으로 시프트하면 숫자를 2로 나눈 결과를 얻게 된다.
5 >> 1
00000000 00000000 00000000 0000010
오른쪽으로 1비트 밀면 마지막 자리의 1이 없어지고 밀린 왼쪽부분을 0으로 채운다.
따라서 결과는 5를 2로 나는 몫인 2가 된다.
*음수인 경우
-5 >> 1
11111111 11111111 11111111 11111011 >> 1
11111111 11111111 11111111 11111101 = -3
 

7. >>> (논리적 오른쪽 시프트 연산자)

부호 비트를 무시하고 오른쪽으로 이동한다. 빈 공간은 항상 0으로 채운다.
양수와 음수를 동일하게 다룬다.