반응형
연산자 | 기능 |
& | 비트단위 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 |