코딩질문자 2022. 4. 12. 02:16
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