인프런 커뮤니티 질문&답변

CHAMBIT OH님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C언어

15.2 이진수를 십진수로 바꾸기 연습문제

예제 코드 리뷰

해결된 질문

24.09.13 00:41 작성

·

34

1

이진수를 십진수로 바꾸는 함수 부분을 이렇게 작성했는데, 기능상으로는 문제가 없어보이는데 다른 측면에서 문제가 될 수 있는 경우가 어떻게 될까요?

unsigned char to_decimal(const char bi[])

{

unsigned char sum = 0;

int j = 0;

for (int i = strlen(bi) - 1; i >= 0; --i)

{

if (bi[j] == '1')

sum = sum + (int)pow(2, i) * 1;

else if (bi[j] != '0')

{

printf("Wrong character : %c", bi[j]);

exit(1);

}

j++;

}

return sum;

}

답변 3

2

Soobak님의 프로필 이미지

2024. 09. 13. 22:32

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

잘 작성하셨습니다.

기능상으로 문제 없으며, 강의에서 안내된 pow() 함수도 잘 사용하셨습니다.

다만, 굳이 조심스레 조언을 드려보자면 ij 변수를 별도의 인덱스로 사용하지 않고 하나의 변수만 사용하더라도 구현이 가능하다는 점입니다.
기능은 잘 동작하지만, 불필요한 부분을 제거하여 개선을함으로써 코드가 보다 간결해지고 가독성을 향상시킨다는 이점이 있을 것 같습니다.

 

인프런 AI 인턴 기능은 인프런 플랫폼 자체의 기능으로, 저와는 무관합니다.
다만, 답변 내용 중 pow() 함수의 사용과 관련해서는 질문 주신 강의가 포함된 섹션 16 비트 다루기 와 관련이 있어 추가 설명을 드려봅니다.
pow() 함수는 실수 연산을 하므로 정확도에 있어서 문제가 있을 수 있으며, 해당 섹션에서 학습하시는 정수 비트 연산에 비해 약간의 성능 저하가 있을 수 있습니다.
따라서, 2 의 거듭제곱을 계산할 때에는 << 와 같은 비트 쉬프트 연산자를 사용해서 지수를 계산하는 것이 보다 정확하고 효율적입니다.
보다 자세한 내용은 이어지는 강의 15.6 비트단위 쉬프트 연산자 에서 자세히 학습하시게 됩니다.

pow() 함수의 사용과 << 연산자 사용을 통한 구현 각각을 비교하실 수 있도록, 강의 내용을 바탕으로한 코드를 첨부드려봅니다. 두 코드는 동일한 결과를 출력합니다.

unsigned char to_decimal(const char bi[]) {
    unsigned char sum = 0;
    int len = strlen(bi);
    
    for (int i = 0; i < len; ++i) {
        if (bi[i] == '1') {
            sum = sum + (unsigned char)pow(2, len - 1 - i);
        } else if (bi[i] != '0') {
            printf("Wrong character : %c", bi[i]);
            exit(1);
        }
    }
    
    return sum;
}
unsigned char to_decimal(const char bi[]) {
    unsigned char sum = 0;
    int len = strlen(bi);
    
    for (int i = 0; i < len; ++i) {
        if (bi[i] == '1') {
            sum = sum + (unsigned char)(1 << (len - 1 - i));
        } else if (bi[i] != '0') {
            printf("Wrong character : %c", bi[i]);
            exit(1);
        }
    }
    
    return sum;
}

0

CHAMBIT OH님의 프로필 이미지
CHAMBIT OH
질문자

2024. 09. 13. 18:14

위에 내용이 관련 내용인지 정확히 이해가 안되네요ㅠ. 설명해주실 수 있으신가요?

Soobak님의 프로필 이미지

2024. 09. 13. 22:34

안녕하세요? 본 질문에 답변 작성드렸습니다.
혹시 추가적으로 궁금하신 점 있으시면 편히 댓글 작성해주세요.

0

인프런 AI 인턴님의 프로필 이미지

2024. 09. 13. 00:46

안녕하세요, 인프런 AI 인턴입니다. CHAMBIT OH님.

이진수를 십진수로 변환하는 함수에 대해 작성해주신 코드 리뷰와 관련하여, 유사한 질문과 답변을 참고할 수 있는 링크들을 아래에 제공해드립니다.

추가적으로, 코드를 리뷰한 결과 몇 가지 지적할 만한 사항이 있습니다:

  1. 문자열 길이(strlen)를 매번 반복문 내에서 계산:

    • strlen 함수는 문자열의 길이를 계산하는 데 시간이 걸리므로, 이 값을 미리 변수에 저장하여 사용하는 것이 더 효율적입니다.
    int len = strlen(bi);
    for (int i = len - 1; i >= 0; --i)
    
  2. pow 함수의 사용:

    • pow 함수는 부동 소수점 연산을 포함하며, 이는 정수형 이진수 변환에 비효율적일 수 있습니다. 대신에 간단한 정수 계산으로 대체할 수 있습니다:
    sum += (bi[j] - '0') << i;
    

    십진수로 변환할 때 2의 제곱수에 대해서는 위와 같은 방식으로 비트 이동 연산자를 이용하면 계산이 효율적입니다.

  3. 입력 문자열의 유효성 검사:

    • 코드 내에서 exit(1)을 호출하여 프로그램을 종료하기보다는, 반환 값을 통해 오류를 처리하거나 예외 처리를 수행하는 것이 더 좋습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.