C 언어로 정수의 설정된 비트 개수 세기

CBeginner
지금 연습하기

소개

이 실습에서는 C 프로그래밍에서 비트 연산을 사용하여 정수에서 설정된 비트 (1) 의 개수를 세는 방법을 배웁니다. 이 실습은 세 단계로 구성됩니다: 정수 입력 읽기, 비트 연산을 사용하여 설정된 비트를 세기, 그리고 개수 출력입니다. 이 실습을 마치면 수론 및 이산수학 개념과 이를 C 프로그래밍에 적용하는 방법에 대한 이해도가 높아질 것입니다.

이 실습은 사용자로부터 정수 입력을 읽는 방법을 보여주며, 이는 비트 카운팅 연습의 첫 번째 단계입니다. 그런 다음, 주어진 정수에서 설정된 비트의 개수를 세는 데 비트 연산을 사용하는 함수를 소개합니다. 마지막으로, 프로그램은 사용자에게 설정된 비트의 개수를 표시합니다.

정수 읽기

이 단계에서는 설정된 비트를 세기 위한 C 프로그래밍에서 정수 입력을 받는 방법을 배웁니다. 정수 입력을 보여주는 간단한 프로그램을 만들어 보겠습니다.

먼저, 비트 카운팅 프로그램을 위한 C 소스 파일을 생성합니다.

cd ~/project
nano bit_counter.c

이제 다음 코드를 파일에 추가합니다.

#include <stdio.h>

int main() {
    int number;

    // 사용자에게 정수 입력을 요청합니다.
    printf("정수를 입력하세요: ");

    // 정수 입력을 읽습니다.
    scanf("%d", &number);

    // 입력된 숫자를 표시합니다.
    printf("입력한 숫자: %d\n", number);

    return 0;
}

이제 프로그램을 컴파일하고 실행해 봅시다.

gcc bit_counter.c -o bit_counter
./bit_counter

예시 출력:

정수를 입력하세요: 42
입력한 숫자: 42

코드 설명:

  • #include <stdio.h>는 표준 입력/출력 라이브러리를 포함합니다.
  • scanf("%d", &number)는 사용자로부터 정수 입력을 읽습니다.
  • printf()는 프롬프트와 입력된 숫자를 표시하는 데 사용됩니다.
  • %d는 정수를 위한 형식 지정자입니다.

이 간단한 프로그램은 설정된 비트 카운팅 연습의 첫 번째 단계인 정수 입력을 받는 방법을 보여줍니다.

비트 연산을 사용하여 1 의 개수 세기

이 단계에서는 C 에서 비트 연산을 사용하여 정수에서 설정된 비트 (1) 의 개수를 세는 방법을 배웁니다.

이전의 bit_counter.c 파일을 수정하여 비트 카운팅을 구현해 보겠습니다.

cd ~/project
nano bit_counter.c

이전 내용을 다음 코드로 바꿉니다.

#include <stdio.h>

// 비트 연산 AND 를 사용하여 설정된 비트를 세는 함수
int countSetBits(int number) {
    int count = 0;

    while (number) {
        // 최하위 비트를 확인합니다.
        count += number & 1;

        // 숫자를 오른쪽으로 비트 이동합니다.
        number >>= 1;
    }

    return count;
}

int main() {
    int number;

    // 사용자에게 정수 입력을 요청합니다.
    printf("정수를 입력하세요: ");
    scanf("%d", &number);

    // 설정된 비트의 개수를 세고 표시합니다.
    int setBitCount = countSetBits(number);
    printf("%d의 설정된 비트 개수: %d\n", number, setBitCount);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc bit_counter.c -o bit_counter
./bit_counter

예시 출력:

정수를 입력하세요: 42
42의 설정된 비트 개수: 3

코드 설명:

  • countSetBits() 함수는 비트 연산을 사용하여 설정된 비트를 셉니다.
  • number & 1은 최하위 비트를 확인합니다 (비트가 설정되면 1, 그렇지 않으면 0 을 반환).
  • number >>= 1은 숫자를 오른쪽으로 비트 이동하여 다음 비트로 이동합니다.
  • 루프는 모든 비트가 확인될 때까지 계속됩니다.

비트 연산 분석:

  • 42 는 2 진수로 101010 입니다.
  • 비트 위치: 1 0 1 0 1 0
  • 설정된 비트 개수: 3

이 방법은 최소한의 연산 단계를 사용하여 정수에서 1 의 개수를 효율적으로 셉니다.

개수 출력

이 마지막 단계에서는 비트 카운팅 프로그램을 개선하여 더 자세한 출력을 제공하고 설정된 비트 개수를 출력하는 다양한 방법을 보여줍니다.

bit_counter.c 파일을 수정하여 더 포괄적인 출력을 추가해 보겠습니다.

cd ~/project
nano bit_counter.c

다음 구현으로 코드를 업데이트합니다.

#include <stdio.h>

// 비트 연산 AND 를 사용하여 설정된 비트를 세는 함수
int countSetBits(int number) {
    int count = 0;

    while (number) {
        count += number & 1;
        number >>= 1;
    }

    return count;
}

int main() {
    int number;

    // 사용자에게 정수 입력을 요청합니다.
    printf("정수를 입력하세요: ");
    scanf("%d", &number);

    // 설정된 비트의 개수를 셉니다.
    int setBitCount = countSetBits(number);

    // 여러 형식으로 개수를 출력합니다.
    printf("십진수: %d\n", number);
    printf("이진수 표현: ");

    // 이진수 표현 출력
    for (int i = 31; i >= 0; i--) {
        int bit = (number >> i) & 1;
        printf("%d", bit);
    }
    printf("\n");

    // 설정된 비트 개수 결과 출력
    printf("설정된 비트 개수: %d\n", setBitCount);
    printf("설정된 비트 비율: %.2f%%\n",
           (float)setBitCount / 32 * 100);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc bit_counter.c -o bit_counter
./bit_counter

예시 출력:

정수를 입력하세요: 42
십진수: 42
이진수 표현: 00000000000000000000000000101010
설정된 비트 개수: 3
설정된 비트 비율: 9.38%

코드 설명:

  • 이진수 표현 출력 추가
  • 설정된 비트의 백분율 계산 포함
  • 비트 연산을 사용하여 개별 비트 추출
  • 다양한 관점에서 비트 개수를 제공하도록 출력 형식 지정

이제 프로그램은 정수의 비트 구성에 대한 포괄적인 정보를 제공합니다.

  • 십진수 값
  • 전체 32 비트 이진수 표현
  • 설정된 비트의 총 개수
  • 설정된 비트의 백분율

요약

이 실습에서는 먼저 C 프로그래밍에서 정수 입력을 읽는 방법을 배웠습니다. 이는 사용자 입력을 받기 위해 scanf() 함수를 사용하고 입력된 숫자를 표시하기 위해 printf() 함수를 사용하는 것을 포함합니다. 다음으로, 주어진 정수에서 설정된 비트 (1) 의 개수를 계산하는 countSetBits()라는 함수를 구현했습니다. 이 함수는 숫자의 비트를 반복하여 비트 연산 AND 를 사용하여 최하위 비트를 확인하고, 그런 다음 숫자를 오른쪽으로 비트 이동하여 다음 비트로 이동합니다. 설정된 비트의 개수가 누적되어 반환됩니다.