[Algorithm] 비트연산

한결·2023년 2월 28일
0

Algorithm

목록 보기
13/23

비트연산

비트연산자

연산자연산자의 기능
&비트단위로 AND 연산을 한다. (하나라도 0이면 0) 특정비트를 0으로만들때 사용하는 연산
\비트단위로 OR 연산을 한다. 특정비트를 1로 만들 때 사용
^비트단위로 XOR 연산을 한다. (같으면 0 다르면 1) 비교할때 사용
~단항 연산자로서 피연산자의 모든 비트를 반전시킨다.(0011 -> 1100)
<<피연산자의 빈트 열을 왼쪽으로 이동시킨다. (a<<2 0010 -> 1000 == a x (2^2))/(a<<1 == a x 2)
>>피연산자의 비트 열을 오른쪽으로 이동시킨다. (<< 의 경우처럼 생각하면 나눗셈처럼 됨)
  • 1 << n

    • 2^n의 값을 갖는다.
    • 원소가 n개일 경우의 모든 부분집합의 수를 의미한다.
    • Power set(모든 부분 집합)
      • 공집합과 자기 자신을 포함한 모든 부분집합
      • 각 원소가 포함되거나 포함되지 않는 2가지 경우의 수를 계산하면 모든 부분집합의 수가 계산된다
  • i&(1<<i)

    • 계산 결과는 i의 j번째 비트가 1인지 아닌지를 의미한다.

      • 연산결과가 0이면 j비트는 0
  • 8자리 비트로 변환

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)
  • 7자리 2진수 -> 10진수
# 0000000111100000011000000111

arr = list(map(int,input()))
N =  len(arr)
num = 0
for i in range(N):
    j = i % 7
    # print(arr[i] * (2**(6-j)))
    num += arr[i] * (2**(6-j))
    # print(num)
    if j == 6:
        print(num)
  • 16진수 -> 각 자리를 4비트의 이진수로 변환
'''
01D06079861D79F99F
'''
arr = input()
for x in arr:
    num = int(x,16)
    for j in range(3,-1,-1):
        bit = 1 if num&(1 << j) else 0
        print(bit, end = ' ')
    print(' ', end = '')
  • 0x : 16진수
  • 0b : 2진수

엔디안

  • 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 의미하며 HW 아키텍처마다 다르다
  • 주의 : 속도 향상을 위해 바이트 단위와 워드 단위를 변환하여 연산 할 때 올바로 이해하지 않으면 오류를 발생 시킬 수 있다.
  • 엔디안은 큭 두가질 나뉨
    • 빅 엔디안 : 보통 큰 단위가 앞에 나옴. '네트워크'
    • 리틀 엔지안 : 작은 단위가 앞에 나옴. '대다수 데스크탑 컴퓨터'
종류0x1234의 표현0x12345678의 표현
빅 엔디안12 3412 34 56 78
리틀 엔디안34 1278 56 34 12
  • 엔디안 확인 코드
import sys
print(sys.byteorder) # little

0개의 댓글