오도원입니다.

건강과 행복을 위하여

컴퓨터공학/알고리즘

01-3. 비트연산

오도원공육사 2020. 4. 5. 21:42
반응형
연산자 기능
& 비트단위 and
| 비트단위 or
^ 비트단위 xor (같으면 0, 다르면 1) 
~ 모든 비트 반전
<< 비트 열을 왼쪽으로 이동
>> 비트 열을 오른쪽으로 이동

비트연산은 다른 연산에 비해 속도가 빠르다.

 

예) 홀짝비교 => n % 2이용 또는 n & 1을 이용하여 가능

 

비트연산

1 << n

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

i & (1 << j) : 특정 위치의 비트가 1인지 판별

  • i의 j번째 비트가 1인지 아닌지를 의미

활용예시)

1. 8비트 문자형 변수에 저장된 비트값들을 출력하는 함수

def bitPrint(i):
	for j in range(7, -1, -1):
    	print('1' if (i & (1 << j)) else '0', end="")
        # print("%d" % ((i >> j) & 1), end="")

for i in range(-5, 6):
	print("%2d = " %i, end="") # 십진수 출력
    bitPrint(i) # 이진수 출력
    print()

 

2. 4바이트 크기의 인트형 변수에 저장된 값들을 한 바이트씩 읽어서 비트형태로 출력하는 예제

a = 0x10
x = 0x01020304
print("%d = "%a, end="")
bitPrint(a)
print()

print("%08x = " %x, end="")
for i in range(0, 25, 8):
	bitPrint(x >> i)
    print(end=" ")

16진수 하나는 2진수 4개로 표현된다. 1byte는 16진수 2개로 이루어지며, 2진수 8개로 표현된다.

 

엔디안(Endianness)

> 컴퓨터 메모리와 같은 1차원의 공간에 여러개의 연속된 대상을 배열하는 방법. h/w아키텍처마다 다르다.

> 주의사항 : 속도향상을 위해 바이트 단위와 워듣 단위로 변환하여 연산할 때 잘못 이해하면 오류를 발생할 수 있다.

 

빅인디안(big-endian)

  • 보통 큰 단위가 앞에 나온다.
  • 네트워크

리틀인디안(little - endian)

  • 작은 단위가 앞에 나온다.
  • 대다수 데스크탑 컴퓨터

실제 하위바이트부터 어떤 식으로 저장되는지 살펴보자.

  0x1234 0x12345678
빅인디안 12 34 12 34 56 78
리틀인디안 34 12 78 56 34 12

 

자신의 컴퓨터가 어떤 인디언 방식인지 확인하는 코드

큰 바이트값 00이 메모리에 어떤 식으로 저장되는지 확인하면 된다.

n = 0x00111111

if n & 0x11:
	print("little endian") # c[0] 11 11 1 00
else:
	print("big endian") # 00 11 11 11

더 큰 바이트값인 00이 메모리의 시작주소에 해당되는 위치에 저장된다면 빅인디언이고 그렇지 않다면 리틀 인디언이다.

 

배타적 논리합 XOR

xor연산자(^)를 사용해서 변환된 값은 다시 xor연산자를 통해 복구가능. 비트연산자^를 두번쓰면 처음 값을 반환

a = 0x86
key = 0xAA

print("a ==> ", end="")
bitPrint(a)
print()

print("a^key ==> ", end="")
a ^= key
bitPrint(a)
print()

print("a^key ==> ", end="")
a ^= key
bitPrint(a)
print()

 

 

반응형

'컴퓨터공학 > 알고리즘' 카테고리의 다른 글

01-5. 실수  (0) 2020.04.05
01-4. 진수  (0) 2020.04.05
01-2. 알고리즘 복잡도  (0) 2020.04.05
01-1. 시작하기  (0) 2020.04.05
01. List 1 - 5차시 Sort  (0) 2020.02.18