Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 정수의 처음 3비트와 마지막 3비트를 십진수로 변환하기

이 문제에서는 하나의 숫자 N이 주어지며, 주어진 정수 N의 처음 세 비트와 마지막 세 비트를 추출하여 이를 십진수로 변환하는 것이 우리의 과제입니다.

예시를 통해 문제를 이해해 보겠습니다.

입력 : 57
출력 : 7 1

문제 풀이 접근법

가장 간단한 해결 방법은 숫자 n을 이진수로 변환한 뒤, 각 비트를 배열에 저장하는 것입니다. 그다음 배열에서 처음 세 개 값과 마지막 세 개 값을 각각 따로 읽어 십진수로 변환하면 됩니다. 이렇게 얻은 두 십진수 값이 바로 우리가 원하는 결과입니다.

예를 들어 숫자 80을 살펴보겠습니다.

80을 이진수로 변환하면 1010000입니다.

처음 세 비트(101)의 십진수 값은 5입니다.

마지막 세 비트(000)의 십진수 값은 0입니다.

따라서 출력 결과는 5 0이 됩니다.

구현 예제

아래는 위에서 설명한 솔루션의 동작을 보여주는 C++ 프로그램입니다.

#include <bits/stdc++.h>
using namespace std;
void convtbnTodcml(int n)
{
   int arr[64] = { 0 };
   int x = 0, index;
   for (index = 0; n > 0; index++) {
      arr[index] = n % 2;
      n /= 2;
   }
   x = (index < 3) ? 3 : index;
   int d = 0, p = 0;
   for (int index = x - 3; index < x; index++)
      d += arr[index] * pow(2, p++);
   cout << d << " ";
   d = 0;
   p = 0;
   for (int index = 0; index < 3; index++)
      d += arr[index] * pow(2, p++);
   cout << d;
}
int main()
{
   int n = 57;
   cout<<"숫자 "<<n<<"의 처음과 마지막 비트의 십진수 변환값: ";
   convtbnTodcml(n);
   return 0;
}

출력 결과

숫자 57의 처음과 마지막 비트의 십진수 변환값: 7 1

코드 설명

위 프로그램의 동작 과정을 단계별로 살펴보면 다음과 같습니다.

1. 이진수 변환: 숫자 n을 2로 나눈 나머지를 배열에 차례대로 저장합니다. 이때 배열에는 최하위 비트(LSB)부터 순서대로 저장되므로, 배열의 앞부분이 곧 마지막 세 비트에 해당합니다.

2. 처음 세 비트 처리: 총 비트 개수(index)가 3보다 작으면 3으로 보정하여, 상위 세 비트에 해당하는 배열 구간의 값을 2의 거듭제곱과 곱해 합산함으로써 십진수로 변환합니다.

3. 마지막 세 비트 처리: 배열의 인덱스 0부터 2까지의 값을 같은 방식으로 합산하여 십진수로 변환한 뒤 출력합니다.

이 알고리즘의 시간 복잡도는 O(log N)이며, 공간 복잡도 역시 O(log N)입니다. 숫자를 이진수로 변환하는 데 필요한 비트 수에 비례하기 때문입니다.