쉬프트 연산
쉬프트 연산(Shift Operation)은 비트 단위로 숫자를 이동하는 연산이며 이 연산은 주로 비트 단위 조작이나 수의 배수 증가/감소 등의 용도로 사용된다. 쉬프트 연산은 주어진 수를 이진수로 나타내어 각 비트들을 왼쪽이나 오른쪽으로 이동시키는 작업을 수행한다.
두 가지 주요 종류의 쉬프트 연산이 있습니다
- 왼쪽 쉬프트 (Left Shift): 주어진 수의 비트들을 왼쪽으로 이동시킨다. 이동하는 동안 새로운 비트가 오른쪽에 추가된다. 왼쪽으로 이동하면 수가 2의 거듭제곱 배로 증가한다.
- 오른쪽 쉬프트 (Right Shift): 주어진 수의 비트들을 오른쪽으로 이동시킨다. 이동하는 동안 새로운 비트가 왼쪽에 추가된다. 오른쪽으로 이동하면 수가 2의 거듭제곱으로 나눠지는 효과가 있다.
다음과 같은 상황에 쉬프트 연산이 활용된다.
- 비트 조작: 특정 비트를 설정하거나 해제할 때 사용됩니다.
- 수의 배수/나눗셈: 쉬프트 연산을 이용하여 수를 효율적으로 곱하거나 나누는 연산을 수행할 수 있습니다.
- 데이터 압축: 비트 단위로 데이터를 압축하거나 해제할 때 사용될 수 있습니다.
2진수 쉬프트 연산
2진수 쉬프트 연산은 비트 단위로 숫자를 이동하는 연산이다. 파이썬에서는 << 연산자를 사용하여 왼쪽 쉬프트(Left Shift) 연산을 수행하며, >> 연산자를 사용하여 오른쪽 쉬프트(Right Shift) 연산을 수행할 수 있다. 이러한 연산은 주로 비트 조작, 수의 배수 증가/감소 등의 용도로 사용된다
간단한 2진수 쉬프트 연산 예시를 들어보겠다.
왼쪽 쉬프트 (Left Shift) 예시:
num = 10 # 10진수
binary_num = bin(num) # 10진수를 2진수 문자열로 변환
shifted = num << 2 # 왼쪽으로 2비트 쉬프트
print(f"Original: {binary_num}")
print(f"Shifted: {bin(shifted)}")
출력 결과:
Original: 0b1010
Shifted: 0b101000
오른쪽 쉬프트 (Right Shift) 예시:
num = 20 # 10진수
binary_num = bin(num) # 10진수를 2진수 문자열로 변환
shifted = num >> 2 # 오른쪽으로 2비트 쉬프트
print(f"Original: {binary_num}")
print(f"Shifted: {bin(shifted)}")
출력 결과:
Original: 0b10100
Shifted: 0b101
10진수 쉬프트 연산
10진수 쉬프트 연산은 주로 정수의 비트 단위 이동을 나타내며, 수의 배수 증가/감소 등에 활용될 수 있다. 여기서는 10진수 쉬프트 연산의 예시를 보겠다.
왼쪽 쉬프트 (Left Shift) 예시:
num = 12
shifted = num << 2 # 왼쪽으로 2자리(비트) 쉬프트
print(f"Original: {num}")
print(f"Shifted: {shifted}")
출력 결과:
Original: 12
Shifted: 48
위 예시에서는 10진수 12를 왼쪽으로 2자리(비트) 쉬프트하면 결과적으로 48이 된다. 왼쪽으로 쉬프트하는 경우에는 2의 거듭제곱 배수로 값이 증가하게 된다. 원래 값인 12는 2^2 = 4배가 되어 48이 된다.
오른쪽 쉬프트 (Right Shift) 예시:
num = 32
shifted = num >> 3 # 오른쪽으로 3자리(비트) 쉬프트
print(f"Original: {num}")
print(f"Shifted: {shifted}")
출력 결과:
Original: 32
Shifted: 4
16진수 쉬프트 연산
16진수 쉬프트 연산은 16진수를 비트 단위로 이동하는 연산을 나타냅니다. 16진수 쉬프트 연산은 비트 연산을 통해 이루어지며, 16진수 값을 이진수로 변환한 후 비트 쉬프트를 수행합니다. 여기서는 16진수 쉬프트 연산의 예시를 보여드리겠습니다.
왼쪽 쉬프트 (Left Shift) 예시:
hex_num = 0x18 # 16진수 0x18 (24)
shifted = hex_num << 2 # 왼쪽으로 2비트 쉬프트
print(f"Original: {hex(hex_num)}")
print(f"Shifted: {hex(shifted)}")
출력 결과:
Original: 0x18
Shifted: 0x60
위 예시에서는 16진수 0x18 (십진수로 24)을 왼쪽으로 2비트 쉬프트하면 결과적으로 0x60 (십진수로 96)이 된다. 왼쪽으로 쉬프트하는 경우에는 각 비트들이 왼쪽으로 이동하며, 새로운 비트가 오른쪽에 추가된다.
오른쪽 쉬프트 (Right Shift) 예시:
hex_num = 0xE0 # 16진수 0xE0 (224)
shifted = hex_num >> 4 # 오른쪽으로 4비트 쉬프트
print(f"Original: {hex(hex_num)}")
print(f"Shifted: {hex(shifted)}")
출력 결과 :
Original: 0xe0
Shifted: 0xe
위 예시에서는 16진수 0xE0 (십진수로 224)을 오른쪽으로 4비트 쉬프트하면 결과적으로 0xe (십진수로 15)이 된다. 오른쪽으로 쉬프트하는 경우에는 각 비트들이 오른쪽으로 이동하며, 새로운 비트가 왼쪽에 추가된다.
'시스템' 카테고리의 다른 글
[시스템] 커널? 알아볼게요 ( with. python ) (0) | 2023.08.18 |
---|---|
[시스템] 바인드 쉘 ? 알아볼게요 ( with. shell script ) (0) | 2023.08.18 |
[시스템] 리버스 쉘 ? 알아볼게요 ( with. python, shell script ) (0) | 2023.08.18 |
[시스템] 정적 라이브러리 ? 동적 라이브러리 ? ( with . code ) (0) | 2023.08.17 |
[시스템] 꼭 알아야 하는 버퍼 오버 플로우 (0) | 2023.08.11 |