하위 집합 생성에 대한 답변을 찾고있는 동안 this code snippet이 발생합니다.주어진 이진 문자열의 하위 집합을 생성하십시오.이 코드는 어떻게 작동합니까?
start
N; //an integer
X = N
while true
print X
if(X == 0)
break;
X = (X-1) & N;
end while
end
아무도이 코드가 작동하는 이유를 설명 할 수 있습니까? 미리 감사드립니다.
답변 해 주셔서 감사합니다. 내 증명 아이디어는 다음과 같습니다 :
N
을 마스크로 생각하면 중요한 비트는 N
의 1의 위치입니다. 이것을 마스크 된 공간이라고 부릅니다. X
은 항상 N
의 하위 집합이므로 X
의 카운트 다운은 마스크 된 공간에서 카운트 다운과 같습니다 (마스크 된 공간에서 반전 된 비트). 따라서 X
과 (X-1) & N
사이에는 다른 하위 집합이 없습니다.
이 꽤 X'가 반복 될 때마다 작아지는 '것을 보여주지 않는다 : X' 이제까지'의 가장 오른쪽 1 비트의 오른쪽에 1 비트를했다'경우 N '이면'X = (X-1) & N '은'X & N '을 변경하지 않습니다. 그래서 우리는 그것이 일어날 수 없다는 것을 보여줄 필요가 있습니다. 분명히 첫 번째 반복에서는'X == N '이 될 수없고'X'의 각 업데이트는 'N'과 AND로 끝나기 때문에 이런 비트는 나타날 수 없습니다. –
@j_random_hacker하지만 그 대답은 3 번에서 나온 결과입니다. 맞습니까? – harold
@harold : 포인트 3은 실제로 2에서 시작하는 모든 반복이 'X & N'의 고유 값을 생성한다는 것을 의미하지만, 증명은 불완전합니다. 명시된 바와 같이 포인트 1은 중간 결과 만 기술하기 때문에 실제로는 관련이 없습니다. 대신 필요한 것은 예 : "(X-1) & N == 0"이면 "(X-1) & N