2024년 02월 04일
2024년 02월 08일
비트 연산자와 시프트 연산자의 이해와 활용방법

안녕하세요. 오늘은 비트 연산자와 시프트 연산자에 대해 알아보겠습니다. 이걸 대체 어떤 용도로 쓰는지 궁금하신 분들이 있을거라 생각하는데, 용도에 대해서도 알려드리겠습니다.

비트 연산자란?
비트 연산자는 컴퓨터가 이해하는 2진수로 표현된 데이터에 대해 비트 단위로 연산을 수행하는 연산자입니다. 비트 연산자는 4가지 종류가 있습니다.
- AND 연산자(&): 두 비트가 모두 1일 때만 결과가 1이 됨. 1010 & 1100 = 1000
- OR 연산자(|): 두 비트 중 하나라도 1이면 결과가 1이 됨. 1010 | 1100 = 1110
- XOR 연산자(^): 두 비트가 서로 다를 때만 결과가 1이됨. 1010 ^ 1100 = 0110
- NOT 연산자(~): 비트를 반전시킴. ~1010 = 0101
시프트 연산자란?
시프트 연산자는 비트를 왼쪽이나 오른쪽으로 이동시키는 연산자입니다. 시프트 연산자는 크게 3가지 종류가 있습니다.
- 왼쪽 시프트 연산자(<<): 비트를 왼쪽으로 n번 이동. 오른쪽에는 0이 채워짐. 1010 << 2 = 101000
- 오른쪽 시프트 연산자(>>): 비트를 오른쪽으로 n번 이동. 왼쪽에는 부호 비트가 채워짐. 1010 >> 2 = 0010 입니다.
- 부호 없는 오른쪽 시프트 연산자(>>>): 비트를 오른쪽으로 n번 이동시킴. 왼쪽에는 0이 채워짐. 1010 >>> 2 = 0010 입니다.
이해하기 더 쉽게 좀 더 부연설명을 추가해보겠습니다.
부호 있는 연산자
1101 (음수를 나타냄)
2번 오른쪽으로 이동 (>>): 1111 (부호 비트가 채워짐)
2번 오른쪽으로 이동 (>>>): 0011 (0이 채워짐)
부호 없는 연산자
1101 (13을 나타냄)
2번 오른쪽으로 이동 (>>): 1111 (부호 비트가 채워짐)
2번 오른쪽으로 이동 (>>>): 0011 (0이 채워짐)
비트 연산자와 시프트 연산자의 사용 용도
비트 연산자와 시프트 연산자 사용 용도에 대해서 예를 들어보겠습니다.
- 비트 마스킹: 비트 연산자를 이용하여 특정 비트를 선택하거나 변경하는 기법입니다. 예를 들어, RGB 색상을 표현하는 32비트 정수에서 빨간색 성분만 추출하고 싶다면 아래처럼 AND 연산자를 사용할 수 있습니다.
1 2 3 4 |
int rgb = 0xFFAABBCC; // RGB 색상을 16진수로 표현한 정수 int red = rgb & 0xFF000000; // 빨간색 성분만 남기고 나머지는 0으로 만듦 System.out.println(Integer.toHexString(red)); // ff000000 출력 |
- 비트 필드: 비트 연산자를 이용하여 여러 개의 논리적인 값을 하나의 정수에 저장하는 기법입니다. 예를 들어, 8개의 스위치의 상태를 표현하고 싶다면 OR 연산자와 시프트 연산자를 사용할 수 있습니다.
1 2 3 4 5 6 |
int switches = 0; // 8개의 스위치의 상태를 저장할 정수 switches |= 1 << 0; // 첫 번째 스위치를 켬 switches |= 1 << 3; // 네 번째 스위치를 켬 switches |= 1 << 7; // 여덟 번째 스위치를 켬 System.out.println(Integer.toBinaryString(switches)); // 10001001 출력 |
- 빠른 연산: 시프트 연산자를 이용하여 곱셈이나 나눗셈과 같은 복잡한 연산을 간단하게 수행할 수 있습니다. 왼쪽 시프트 연산자나 오른쪽 시프트 연산자를 사용해서 2의 거듭제곱을 곱하거나 나누는 예시를 알려드리겠습니다.
1 2 3 4 5 |
int x = 10; // 임의의 정수 x = x << 3; // x에 2의 3승을 곱함. x = x * 8 x = x >> 2; // x를 2의 2승으로 나눔. x = x / 4 System.out.println(x); // 20 출력 |
마무리
이번에는 비트 연산자와 시프트 연산자에 대해 알아보았습니다. 비트 연산자와 시프트 연산자는 컴퓨터가 이해하는 2진수로 표현된 데이터에 대해 비트 단위로 연산을 수행하는 연산자인데, 비트 연산자와 시프트 연산자를 잘 이해하면 컴퓨터의 동작 원리와 프로그램의 성능 향상에 도움이 될 것입니다.
이상으로 비트 연산자와 시프트 연산자에 대한 블로그 글을 마치겠습니다. 다른 글도 확인하시려면 여기를 눌러서 블로그 메인도 방문해주세요. 감사합니다.