본문 바로가기

머신러닝

파이썬 비트 연산(Bitwise Operation)

 비트(Bit)란 Binary Digit의 줄임 말로써, 컴퓨터가 처리하는 데이터의 최소 단위입니다. 모두가 알듯, 컴퓨터의 내부 연산에는 2진수가 사용되며, 이에따라 비트는 0과 1로써 구성됩니다. 이런 비트를 다루겠다는 말은 이진 연산을 다뤄보겠다-와 같은 의미일 것 같습니다. 이번에는 파이썬에서 제공하는 비트 연산에 대해 알아보고, 카카오 코딩 테스트 문제 하나를 예제로써 해결해보겠습니다.


 1. 10진수와 2진수간의 변환

# 13이라는 10진수를 2진수로 변환
bin(13) # Output= '0b1101' / 0b는 이진수임을 의미합니다. / str으로 출력됩니다.
format(1101, 'b') # Output= '0b1101' / str으로 출력됩니다.
format(1101, '#b') # Output= '1101' / #을 사용하면 0b를 제외하고 출력됩니다.

# 1101이라는 2진수를 10진수로 변환
int('1101', base=2) # Output= 13 / int로 출력됩니다.

2. 비트 논리 연산자

 : AND, OR, XOR, NOT은 &, |, ^, ~ 로써 사용됩니다.

bin(0b1101 & 0b1001) #AND 연산, Output= 0b1001
bin(0b1101 | 0b1001) #OR  연산, Output= 0b1101
bin(0b1101 ^ 0b1001) #XOR 연산, Output= 0b0100
bin(~0b1101) 	     #NOT 연산, Output= 0b0010

3. 비트 시프트 연산자

 : <<, >>는 비트를 왼쪽 또는 오른쪽으로 이동시키는 역활을 합니다.

0b1101 << 1 #SHIFT 연산, Output= 26 / 0b1101 -> 0b11010 = 26
0b1101 >> 1 #SHIFT 연산, Output= 12 / 0b1101 -> 0b110   = 6

이제 카카오 코딩 테스트 문제 를 읽어보시면, 비트 연산 중에서도 OR, |을 통해 쉽게 구현할 수 있겠다라는 생각이 듭니다. 실제 코드는 아래와 같이 완성할 수 있습니다.

def solution(n, arr1, arr2):
    answer_list = []
    for rowOfarr1, rowOfarr2 in zip(arr1, arr2):
    	rowOR = bin(rowOfarr1|rowOfarr2)[2:] #두개 행간 OR 비트 연산을 시행하고, 0b를 제외한 본체만 가져온다.
        rowOR = str(rowOR) #아래 과정을 위해 str으로 변환
        rowOR = rowOR.rjust(n, '0') #rowOR을 n자리수로 통일하고, 빈자리는 0로 패딩
        #rowOR의 1은 #으로, 0는 공백으로 변환
        #rowOR = rowOR.replace('1','#').replace('0',' ') #replace() 활용
        rule = str.maketrans('10','# ') #maketrans(), translate() 활용
        rowOR = rowOR.translate(rule) 
        answer_list.append(rowOR)
    return answer_list

'머신러닝' 카테고리의 다른 글

Model-agnostic 이란?  (0) 2021.06.06
정규 표현식(Regular Expressions) 및 문자열 다듬기  (0) 2020.05.02
교차 검증(Cross Validation)  (0) 2020.03.30