Algorithm

비트 연산

5_ssssseung 2021. 4. 15. 16:09

비트 연산

비트 연산자

연산자연산자의 기능
&비트단위로 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