[Python] 비트 연산자 사용하기 - &, |, ^, ~, <<, >>

    파이썬의 비트연산

    비트연산자는 2진수 숫자에 사용한다.

    산자 기능 문법 설명
    & 비트 AND a & b a와 b의 비트를 AND 연산
    | 비트 OR a | b a와 b의 비트를 OR 연산
    ^ 비트 XOR a ^ b a와 b의 비트를 XOR 연산(배타적 OR, Exclusive OR)
    ~ 비트 NOT ~x x의 비트를 뒤집음
    <<  비트 왼쪽 시프트 a << b a의 비트를 b번 왼쪽으로 이동시킴
    >>  비트 오른쪽 시프트 a >> b a의 비트를 b번 오른쪽으로 이동시킴

     

    1. 10진수와 2진수 변환하기

    • 10진수를 2진수로 된 문자열로 변환할 때는 bin()을 사용한다.
    • 반대로 2진수에서 10진수로는 입력 즉시 변환된다.
    num_2 = bin(13)
    print(num_2)
    # 13(10) → (2) : 10진수 13을 2진수로 변환
    
    print(0b1101)
    # 0b1101(2) → (10)

     

    2. 비트 논리 연산자 사용하기

    >>> bin(0b1101 & 0b1001)    # 비트 AND
    '0b1001'
    >>> 13 & 9                  # 비트 AND
    9
    >>> bin(0b1101 | 0b1001)    # 비트 OR
    '0b1101'
    >>> 13 | 9                  # 비트 OR
    13
    >>> bin(0b1101 ^ 0b1001)    # 비트 XOR
    '0b100'
    >>> 13 ^ 9                  # 비트 XOR
    4
    >>> bin(~0b1101)            # 비트 NOT
    '-0b1110'
    >>> ~13                     # 비트 NOT
    -14

     

    • 파이썬에서 이진수(binary)는 0b를 앞에 붙여 나타낸다.
    • 결과값은 두 값의 각 자릿수를 연산한다.

     

    a & b (AND) : 두 값이 모두 1일 때, 1을 반환

    & a 1101 (13)
    b 1001 (9)
    result 1001 (9)

     

    a | b (OR) : 두 값 중 하나라도 1이라면 1을 반환

    | a 1101 (13)
    b 1001 (9)
    result 1101 (13)

    a ^ b (XOR) : 두 입력값을 비교하여, 같지 않으면 1을 반환

    ^ a 1101 (13)
    b 1001 (9)
    result 0100 (4)

     

    ~ a (NOT) : a의 비트를 뒤집는다. (0→1, 1→0)

    • 값이 제멋대로 나오는 경우가 더러 있어서, 계산 방법은 아래 영상을 참고하였다. (영상 13분 경)
    • 참고 : https://www.youtube.com/watch?v=rn6UImJw0hY
    • 연산 순서
      1. 비트 뒤집기
      2. 맨 앞에 부호를 제외하고, 다시 뒤집는다. (1의 보수 만들기)
      3. 그 값에 1을 더해준 뒤(2의 보수 만들기), 10진수 변환
      4. 부호 붙여주기

     

    3. shift 연산

    <<(좌측) / >>(우측)으로 한 칸씩 이동한다.

    아래는 10진수 8로 비트 연산을 한 결과값이다.

    num = 0b1000
    
    print(num)
    print(num<<1)
    print(num>>1)

    비트 시프트 연산 원리

     

    a>>b :  a에   를 곱해준다.

    a>>b :  a에   를 곱해준다.

     

     


    🚀 참고

    1) https://dojang.io/mod/page/view.php?id=2460 

    2) https://www.youtube.com/watch?v=rn6UImJw0hY 

    댓글