두 개의 값 시작과 끝이 있다고 가정하고 [시작, 끝] 범위(둘 다 포함)에 있는 모든 숫자의 비트 AND를 찾아야 합니다.
따라서 입력이 start =8 end =12와 같으면 출력은 8이 2진수로 1000이고 12가 2진수로 1100이므로 1000 AND 1001 AND 1010 AND 1011 AND 1100은 1000, 즉 8이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- n :=끝 - 시작 + 1
- x :=0
- 31~0 범위의 b에 대해 1 감소, do
- 2^b
- 루프에서 나오다
- 2^b
- 2^b AND 시작과 끝이 0이 아니면
- x :=x + (2^b)
예
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
def solve(start, end): n = end - start + 1 x = 0 for b in range(31, -1, -1): if (1 << b) < n: break if (1 << b) & start & end: x += 1 << b return x start = 8 end = 12 print(solve(start, end))
입력
8, 12
출력
8