알고리즘 문제 풀다가 남의 풀이를 봤는데 이런 식이 나오더라고요. 2의 거듭제곱인지 판정하는 코드라는데,

bool isPowerOfTwo(int n) {
return (n > 0) && ((n & (n - 1)) == 0);
}


그리고 켜진 비트 개수 세는 것도 이걸로 하던데,

int count = 0;
while (n) {
n &= (n - 1);
count++;
}


솔직히 왜 되는 건지 하나도 모르겠습니다. n-1을 왜 하는 거고 그걸 왜 & 하는 건지... 그냥 외우자니 찝찝하고요.


n에서 1 빼면 비트가 어떻게 바뀌는지 예시로 좀 풀어서 설명해 주실 분 계실까요? 이해하고 넘어가고 싶습니다.