해결된 질문
작성
·
41
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 입니다.
잘 작성하셨습니다.
기능상으로 문제 없으며, 강의에서 안내된 pow()
함수도 잘 사용하셨습니다.
다만, 굳이 조심스레 조언을 드려보자면 i
와 j
변수를 별도의 인덱스로 사용하지 않고 하나의 변수만 사용하더라도 구현이 가능하다는 점입니다.
기능은 잘 동작하지만, 불필요한 부분을 제거하여 개선을함으로써 코드가 보다 간결해지고 가독성을 향상시킨다는 이점이 있을 것 같습니다.
인프런 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
0
안녕하세요, 인프런 AI 인턴입니다. CHAMBIT OH님.
이진수를 십진수로 변환하는 함수에 대해 작성해주신 코드 리뷰와 관련하여, 유사한 질문과 답변을 참고할 수 있는 링크들을 아래에 제공해드립니다.
scanf()함수 질문:
이 질문에서는 scanf
함수를 통해 입력을 받을 때 발생하는 문제와 이와 관련된 함수의 작동 원리에 대한 답변이 있습니다.
변수에 값을 할당하기 전에 컴퓨터는 어떻게 계산을 하나요?:
이 질문에서는 데이터 타입에 따라 값을 저장하고 계산하는 방법에 대해 다루고 있습니다. 자세한 답변을 통해 컴퓨터 내부에서의 계산 과정을 더 깊이 이해할 수 있습니다.
추가적으로, 코드를 리뷰한 결과 몇 가지 지적할 만한 사항이 있습니다:
문자열 길이(strlen
)를 매번 반복문 내에서 계산:
strlen
함수는 문자열의 길이를 계산하는 데 시간이 걸리므로, 이 값을 미리 변수에 저장하여 사용하는 것이 더 효율적입니다.int len = strlen(bi);
for (int i = len - 1; i >= 0; --i)
pow
함수의 사용:
pow
함수는 부동 소수점 연산을 포함하며, 이는 정수형 이진수 변환에 비효율적일 수 있습니다. 대신에 간단한 정수 계산으로 대체할 수 있습니다:sum += (bi[j] - '0') << i;
십진수로 변환할 때 2의 제곱수에 대해서는 위와 같은 방식으로 비트 이동 연산자를 이용하면 계산이 효율적입니다.
입력 문자열의 유효성 검사:
exit(1)
을 호출하여 프로그램을 종료하기보다는, 반환 값을 통해 오류를 처리하거나 예외 처리를 수행하는 것이 더 좋습니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세요? 본 질문에 답변 작성드렸습니다.
혹시 추가적으로 궁금하신 점 있으시면 편히 댓글 작성해주세요.