1. 비트 조작
비트(bit)는 Binary Digit을 줄인 말로 데이터를 나타내는 최소 단위입니다. 0과 1 두 개의 값만을 가질 수 있습니다. 8bit가 모여 1Byte가 되며 이 후 단위들은 킬로, 메가, 기가 등 컴퓨터 저장 용량이나 RAM 용량 등에서 보던 익숙한 단위가 보이게 됩니다.
2. 부울 연산자
가장 기본적인 부울 연산(Boolean Operation)에 대해서 설명드리겠습니다.
- AND
- OR
- NOT
- NAND
- NOR
- XOR
- XNOR
등 으로 소개가 되어있습니다. 저 중에 0과 1의 숫자로 이용하는 '비트 연산자'에서 일부 사용이 가능합니다.
3. 비트 연산자
위의 부울 연산자에서 사용되는 것은 4가지의 연산이 있습니다.
- AND(&)
- 두 자릿수 중 하나라도 0이 있으면 0, 없으면 1로 하는 연산
- OR(|)
- 두 자릿수 중 하나라도 1이 있으면 1, 없으면 0으로 하는 연산
- NOT(~)
- 각 자릿수의 값을 반대로 바꾸는 연산
- XOR(^)
- 두 자릿수의 값이 다르면 1, 같으면 0으로 하는 연산
여기서 시프트 연산이라는 것도 추가가 됩니다.
- 산술 시프트: 부호 비트를 유지하며 나머지 비트를 이동
- >> 'n': n칸만큼 오른쪽으로 이동
- << 'n': n칸만큼 왼쪽으로 이동
- 논리 시프트: 부호 비트를 포함하여 나머지 비트를 이동
- >>> 'n': n칸씩 오른쪽으로 회전
- <<< 'n': n칸씩 왼쪽으로 회전
// @ <<
System.out.println(3 << 1);
System.out.println(-3 << 1);
System.out.println(3 << 2);
System.out.println(-3 << 2);
System.out.println();
// @ >>
System.out.println(5 >> 1);
System.out.println(-5 >> 1);
System.out.println(5 >> 2);
System.out.println();
//논리 시프트(>>>)
System.out.println(3 >>> 1);
System.out.println(-3 >>> 31);
4. 2의 보수
2의 보수(Two's Complement), 컴퓨터가 숫자로 표현하기 위한 여러 표기법 중 하나입니다. 이 중 음수를 효과적으로 표현할 수 있습니다.
예제로 4비트의 비트로 말씀드리겠습니다.
EX) 0000 ~ 1111
해당 예제에서는 기본적으로 2진수를 알고 있다면, 0에서 15까지의 숫자입니다. 여기서 2의 보수로 정리를 한다면
맨 처음 숫자가 0이면 양수, 1이면 음수 형태를 띄우게 됩니다. 이 후 나머지 3개의 비트로 2진수의 값을 지니게 됩니다.
0000: +0 => 0
1000: -0 => -8
0001: +1 => 1
1001: -1 => -1
...
로 -8부터 7까지의 범위를 가지게 됩니다.
5. 코드 풀이
이번 문제에서 간단하고 설명하기 쉬운 문제에 대해서 말씀드리겠습니다.
76번 문제의 '싱글 넘버'
문제의 조건은 숫자 배열 안에 단 한개를 제외한 나머지의 값은 2개씩 들어있다는 조건입니다.
private static int singleNumber(int[] nums) {
int result = 0;
for (int num : nums) {
result = result ^ num;
}
return result;
}
이 때 0을 주어 들어오는 배열 값들을 for문으로 XOR 연산을 시켰습니다. 이 때 XOR 연산의 특징은 '두 자릿수의 값이 다르면 1, 같으면 0으로 하는 연산'으로 2개씩 들어있는 숫자가 전부 0으로 바뀌게 됩니다. 그러므로 단 한개만 들어있는 숫자가 표현이 되기에 for문의 시간 복잡도인 O(n)의 값을 지니게 됩니다.
'개발 > Java' 카테고리의 다른 글
[자.알.인] CH16. 트라이 (1) | 2024.01.22 |
---|---|
[자.알.인] CH08. 연결 리스트 (0) | 2023.12.25 |