비트 연산
비트 연산자
연산자 | 연산자의 기능 |
---|---|
& | 비트단위로 AND 연산 진행 |
| | 비트단위로 OR 연산 진행 |
^ | 비트단위로 XOR 연산 진행 (같으면 0 다르면 1) |
~ | 단항 연산자로서 피연산자의 모든 비트를 반전 |
<< | 피연산자의 비트 열을 왼쪽으로 이동 |
>> | 피연산자의 비트 열을 오른쪽으로 이동 |
1 << n
1은 0001(2)
1 << 3 일 때, 1000(2)로 10진수 값은 8
2^n의 값을 갖는다.
원소가 n개일 경우의 모든 부분집합의 수를 의미
Power Set (모든 부분 집합)
- 공집합과 자기 자신을 포함한 모든 부분집합
- 각 원소가 포함되거나 포함되지 않는 2가지 경우의 수를 계산하면 모든 부분집합의 수가 계산
i & (1 << j)
- 계산 결과는 i의 j번째 비트가 1인지 아닌지를 의미
비트 연산 예제
# 1
def Bbit_print(i):
output = ''
for j in range(7, -1, -1):
output += '1' if i & (1 << j) else '0'
print(output)
for i in range(-5, 6):
print('%3d = ' % i, end = '')
Bbit_print(i)
''' 출력 결과
-5 = 11111011
-4 = 11111100
-3 = 11111101
-2 = 11111110
-1 = 11111111
0 = 00000000
1 = 00000001
2 = 00000010
3 = 00000011
4 = 00000100
5 = 00000101
'''
# 2
def Bbit_print(i):
output = ''
for j in range(7, -1, -1):
output += '1' if i & (1 << j) else '0'
print(output, end = ' ')
a = 0x10
print('%d = ' % a, end = '')
Bbit_print(a)
print()
x = 0x01020304
print('0%X = ' % x, end = '')
for i in range(0, 4):
Bbit_print((x >> i*8) & 0xff)
''' 출력 결과
16 = 00010000
01020304 = 00000100 00000011 00000010 00000001
'''
# 5 비트 연산자 ^를 두 번 연산하면 처음 값을 반환
def Bbit_print(i):
output = ''
for j in range(7, -1, -1):
output += '1' if i & (1 << j) else '0'
print(output)
a = 0x86
key = 0xAA
print('a ==> ', end='')
Bbit_print(a)
# => a ==> 10000110
print('a^=key ==> ', end='')
a ^= key
Bbit_print(a)
# => a^=key ==> 00101100
print('a^=key ==> ', end='')
a ^= key
Bbit_print(a)
# => a^=key ==> 10000110
엔디안
컴퓨터의 메모리와 같은 1차원 공간에 여러 개의 연속된 대상을 배열하는 방법을 의미하며 hw 아키텍처마다 다르다.
주의 : 속도 향상을 위해 바이트 단위와 워드 단위를 변환하여 연산 할 때 올바로 이해하지 않으면 오류를 발생
엔디안은 크게 두 가지로 나뉨
빅 엔디안
- 보통 큰 단위가 앞에 나옴. 네트워크
리틀 엔디안
- 작은 단위가 앞에 나옴. 대다수 데스크탑 컴퓨터
# 3 엔디안 확인 코드
n = 0x00111111
if n & 0xff:
print('little endian')
else:
print('big endian')
# => little endian
- 엔디안 변환 예제 코드
# 4 엔디안 변환 코드
def ce(n): # change endian
p = []
for i in range(0, 4):
p.append((n >> (24 - i * 8)) & 0xff)
return p
x = 0x01020304
p = []
for i in range(0,4):
p.append((x >> (i*8)) & 0xff)
print(p) # => [4, 3, 2, 1]
print("x = %d%d%d%d" % (p[0], p[1], p[2], p[3]))
# => x = 4321
p = ce(x)
print("x = %d%d%d%d" % (p[0], p[1], p[2], p[3]))
# => x = 1234
'Algorithm' 카테고리의 다른 글
Merge Sort (병합 정렬) (0) | 2021.04.19 |
---|---|
n진수와 실수 (0) | 2021.04.15 |
시간 복잡도 개념 및 설명 (0) | 2021.04.13 |
Tree / Binary Tree / Heap (트리, 이진 트리, 힙) (0) | 2021.04.07 |
BFS (Breadth First Search, 너비 우선 탐색) (0) | 2021.03.04 |