kimhana0525   6년 전


scanf로 받은 x값에서 

왜 1을 빼고 나서 shift연산을 해야 하는지 아시나요???ㅠㅠ

소스코드 라인 15,18,21,29에서 x--; 를 하는게 이해가 안되용..

djm03178   6년 전

원소의 범위가 1에서 20까지이기 때문에 x를 그대로 사용할 경우 최하위 비트는 무의미해집니다. 그걸 보완하기 위함으로 보이는데, 사실 이 문제의 경우는 그렇게 할 필요는 없습니다. x-- 를 하지 않는 대신 32번째 줄을 s = (1 << (n + 1)) - 1; 로 해줘도 될 듯합니다.

kimhana0525   6년 전

답변 정말 감사해요...!
x--; 를 없애고도 문제없이 실행되는 것을 확인했습니다.

"최하위 비트가 무의미해진다"는게 무슨 말인지 설명해주실 있나요!!!??
감사합니다!

djm03178   6년 전

1을 1번 왼쪽으로 시프트하면, 10이 됩니다.

1을 2번 왼쪽으로 시프트하면, 100이 됩니다.

1을 3번 왼쪽으로 시프트하면, 1000이 됩니다.

어떻게 해도 가장 오른쪽의 수(최하위 비트)는 0입니다. 이게 1이 되려면, 0번 시프트 하는 연산이 있어야 되는데 x의 범위가 1에서 20까지이기 때문에 그렇게 될 수가 없습니다.

결국, 최하위 비트는 전혀 사용되지 않으므로 무의미해집니다.

kimhana0525   6년 전

문제에서 주어진 집합 S에 원소 0이 포함되지 않게 하기 위한 것이라고 이해했는데 맞나요?

djm03178   6년 전

무슨 뜻인지 잘 모르겠네요. x--; 를 하는 것과 안 하는 것의 차이는 오로지,

1. x--를 했다는 건, 1 = 최하위 비트, 2 = 아래에서 2번째 비트, 3 = 아래에서 3번째 비트, ... 20 = 아래에서 20번째 비트로 표현하겠다는 뜻이고,

2. x--를 안 했다는 건, 1 = 아래에서 2번째 비트, 2 = 아래에서 3번째 비트, 3 = 아래에서 4번째 비트, ... 20 = 아래에서 21번째 비트로 표현한다는 뜻이라는 것 뿐입니다.

어느 경우에도 0은 포함되지 않고, 문제에서 0은 범위로 주어지지 않았으니 0에 대한 고려는 전혀 할 필요가 없습니다.

djm03178   6년 전

제가 질문자님의 생각을 이해하기로는,

x-- 를 하지 않을 경우 최하위 비트는 0이라는 원소의 존재 유무를 나타내니까, 그걸 제거하려고 이렇게 한 거다, 라는 뜻인가요?

그건 조금 확대해석인 것 같고, 제 생각엔 그냥 앞자리부터 깔끔하게 메우고 싶었기 때문이라고 보입니다.

0이라는 원소를 배제하고 싶었던 거라면, 21이나 22라는 원소는 배제하고 싶지 않을 이유가 없는데, 그런 행동은 코드에서 드러나지 않죠.

kimhana0525   6년 전

커피라도 사드리고 싶네요ㅠㅠ! 

자세한 답변 감사해요!!!!! 

댓글을 작성하려면 로그인해야 합니다.