728x90
예시)
1 ~ 19까지 19개의 추가 서비스 목록 있다고 할 때 이를 간단하게 구현하는 방법 by 비트 마스크
20개의 모든 서비스를 받는다고 할 때
fullSerive = (1 << 20) - 1
원소 추가
# 2 번째 서비스를 받을것
s = 2
fullSerive |= (1 << s)
print(fullSerive)
원소의 포함 여부 확인
# 파이썬에서 and와 & 는 미묘하게 다르다
# 원소의 포함 여부 확인
if (fullSerive & b):
print("%d번째 서비스를 받네양!" % (s))
else:
print("서비스 없어영")
원소의 삭제
# 원소의 삭제
t = 0 # 0 번째 제거
print(bin(fullSerive))
fullSerive -= (1 << t)
print(bin(fullSerive))
원소의 토글
# 3 번째 켜기
s = 2
fullSerive = 0b1010
print(bin(fullSerive))
fullSerive = (fullSerive ^ (1 << s))
print(bin(fullSerive))
print(fullSerive)
실행 결과
0 b1010
0 b1110
집합의 크기 구하기
# 집합의 크키 구하기
def bitCount(x):
if x == 0:
return 0
return x % 2 + bitCount(x // 2)
fullSerive = 0b1010
print(bitCount(fullSerive))
실행 결과
2
최소 원소 찾기
# 최하위 비트 구하기
service = 40
print(bin(service))
firstbit = service & -service
print(firstbit)
print(bin(firstbit))
실행 결과
# 음수 표현을 2 의보 수로 한다는 것을 이용하는 것
0 b101000
8 # 최하위 비트의 값을 찾은 것
0 b1000
최소 원소 지우기
# 최소 원소 지우기
service = 40
print(bin(service))
service &= (service - 1)
print(bin(service))
실행 결과0 b101000
0 b100000
모든 부분 집합 순회하기
# 모든 부분집합 순회하기
services = 11
servi = 11
while True:
servi = (servi - 1) & services
if servi == 0:
break
print(bin(servi))
실행 결과
( 속하는 부분 집합 군들을 모두 순회 )
0b1010
0b1001
0b1000
0b11
0b10
0b1
후기
옛날에 시도했다가 포기한 종 만북들
블로그에 포스팅하면서
다시 도전해본다
공부하고 왔더니 이제는 좀 읽힌다
무엇보다 c++기반이다 본디 효율적인 부분에서
아주 좋은 책인 듯싶다.
728x90