728x90
논리 연산자
논리 연산자는 false(0) 또는 true(1) 값을 다루는 연산자로, 기본적인 연산에는 AND, OR, XOR가 있습니다.
1. AND 연산 (a AND b)
- 정의: a와 b가 모두 1일 때만 1을 반환하며, 나머지 경우는 0을 반환합니다.
- 진리표:
A | B | A AND B |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
2. OR 연산 (a OR b)
- 정의: a와 b 중 하나라도 1일 때 1을 반환하며, 둘 다 0일 때만 0을 반환합니다.
- 진리표:
A | B | A OR B |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
3. XOR 연산 (a XOR b)
- 정의: a와 b 중 하나만 1일 때 1을 반환하며, 둘 다 같을 때는 0을 반환합니다.
- 진리표:
A | B | A XOR B |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
비트 연산자
비트 연산자는 컴퓨터 내부에서 이루어지는 연산 중 하나로, AND, OR, XOR 연산을 통해 2진수의 각 비트를 비교해 새로운 값을 생성합니다.
비트 연산의 기본 흐름
- 정수를 2진법으로 변환합니다.
- 각 자릿수별로 논리 연산을 수행합니다.
- 논리 연산의 결과를 다시 10진수로 변환합니다.
예시 1: AND 연산
11과 13의 AND 연산을 살펴보겠습니다.
- 정수를 2진법으로 변환:
- 11 -> 1011
- 13 -> 1101
- 자릿수별로 논리 연산 수행:
- 1 0 1 1
- 1 1 0 1
- ---------
- 1 0 0 1
- AND 연산 결과: 1001
- 2진수를 10진수로 변환:
- 1001 -> 9
예시 2: OR 연산
11과 13의 OR 연산을 살펴보겠습니다.
- 정수를 2진법으로 변환:
- 11 -> 1011
- 13 -> 1101
- 자릿수별로 논리 연산 수행:
- 1 0 1 1
- 1 1 0 1
- ---------
- 1 1 1 1
- OR 연산 결과: 1111
- 2진수를 10진수로 변환:
- 1111 -> 15
예시 3: XOR 연산
11과 13의 XOR 연산을 살펴보겠습니다.
- 정수를 2진법으로 변환:
- 11 -> 1011
- 13 -> 1101
- 자릿수별로 논리 연산 수행:
- 1 0 1 1
- 1 1 0 1
- ---------
- 0 1 1 0
- XOR 연산 결과: 0110
- 2진수를 10진수로 변환:
- 0110 -> 6
비트 연산 구현
프로그래밍 언어는 기본적으로 비트 연산을 지원하고 있습니다.
사칙 연산과 같이 기호 하나로 연산을 할 수 있습니다.
AND | OR | XOR |
& | | | ^ |
11 & 13 = 10 | 11 | 13 = 15 | 11 ^ 13 = 5 |
AND 연산
public class Main {
public static void main(String[] args){
int a = 11;
int b = 13;
System.out.println(11 & 13);
}
}
OR 연산
public class Main {
public static void main(String[] args){
int a = 11;
int b = 13;
System.out.println(11 | 13);
}
}
XOR 연산
public class Main {
public static void main(String[] args){
int a = 11;
int b = 13;
System.out.println(11 ^ 13);
}
}
3개 이상의 비트 연산
3개의 정수 a, b, c에 비트 연산을 적용하려면, 두 개의 값을 비트 연산한 다음 그 결과를 남은 값과 다시 비트 연산하면 됩니다. 중요한 점은 어떤 순서로 계산해도 결과가 같다는 것입니다. 예를 들어, a OR (b OR c)와 (a OR b) OR c는 같은 결과를 출력합니다. 이는 AND, OR, XOR 연산 모두에 적용되는 규칙입니다.
비트 시프트 연산
비트 시프트 연산은 정수 a를 2진법으로 변환한 후, 비트를 왼쪽 또는 오른쪽으로 b만큼 이동시키는 연산입니다.
시프트 연산은 a << b(왼쪽 시프트)와 a >> b(오른쪽 시프트) 기호를 사용해 표현할 수 있습니다.
- 오른쪽 시프트(>>): 비트를 오른쪽으로 이동시키며, 오른쪽에서 밀려난 값은 버려지고 왼쪽으로는 부호 비트(부호 확장)로 채워집니다. 이는 a를 2^b로 나눈 것과 같습니다.
- 왼쪽 시프트(<<): 비트를 왼쪽으로 이동시키며, 왼쪽으로 밀려난 자리에는 0이 채워집니다. 이는 a를 2^b로 곱한 것과 동일합니다.
- 주의사항: 왼쪽 시프트 연산 시, 일부 프로그래밍 언어(C, C++ 등)에서는 결과가 자료형의 범위를 초과하면 오버플로가 발생해 값이 잘릴 수 있습니다. 그러나 파이썬과 같은 언어에서는 원하는 만큼 시프트 연산을 수행할 수 있으며, 자동으로 큰 숫자를 처리합니다.
특히, 1 << N은 2^N과 같은 의미를 가지며, 조합 탐색이나 반복 제곱법 같은 알고리즘에서 유용하게 사용됩니다.
728x90
'알고리즘' 카테고리의 다른 글
[알고리즘] 경우의 수 (0) | 2024.10.30 |
---|---|
[알고리즘] 자릿수 더하기 (Java 예제) (1) | 2024.09.26 |
[알고리즘] 진법 변환 (Java) (0) | 2024.08.22 |
[알고리즘] 동적계획법(Dynamic Programming : DP) (0) | 2024.08.20 |
[알고리즘] 소인수분해 (Java) (0) | 2024.08.17 |