C 言語で整数のセットビットを数える

CCBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、C 言語のビット演算を使って整数のセットビット(1 のビット)の数を数える方法を学びます。この実験は 3 つのステップから成ります。整数の入力を読み取ること、ビット演算を使ってセットビットの数を数えること、そしてそのカウント数を出力することです。この実験の最後まで進めることで、数論や離散数学の概念、およびそれらを C 言語でどのように適用するかについて、より深い理解が得られるでしょう。

実験ではまず、ユーザーから整数の入力を読み取る方法を示します。これはビットカウントの演習の最初のステップです。次に、与えられた整数のセットビットの数を数えるためのビット演算を使った関数を紹介します。最後に、プログラムはセットビットのカウント数をユーザーに表示します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c(("C")) -.-> c/BasicsGroup(["Basics"]) c/BasicsGroup -.-> c/variables("Variables") c/BasicsGroup -.-> c/operators("Operators") c/ControlFlowGroup -.-> c/while_loop("While Loop") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-435171{{"C 言語で整数のセットビットを数える"}} c/operators -.-> lab-435171{{"C 言語で整数のセットビットを数える"}} c/while_loop -.-> lab-435171{{"C 言語で整数のセットビットを数える"}} c/user_input -.-> lab-435171{{"C 言語で整数のセットビットを数える"}} c/output -.-> lab-435171{{"C 言語で整数のセットビットを数える"}} end

整数の読み取り

このステップでは、C 言語でセットビットを数えるために整数の入力を読み取る方法を学びます。整数の入力を示す簡単なプログラムを作成します。

まず、ビットカウントプログラムの C ソースファイルを作成しましょう。

cd ~/project
nano bit_counter.c

次に、以下のコードをファイルに追加します。

#include <stdio.h>

int main() {
    int number;

    // Prompt the user to enter an integer
    printf("Enter an integer: ");

    // Read the integer input
    scanf("%d", &number);

    // Display the entered number
    printf("You entered: %d\n", number);

    return 0;
}

プログラムをコンパイルして実行しましょう。

gcc bit_counter.c -o bit_counter
./bit_counter

出力例:

Enter an integer: 42
You entered: 42

コードの説明:

  • #include <stdio.h> は標準入出力ライブラリをインクルードします。
  • scanf("%d", &number) はユーザーから整数の入力を読み取ります。
  • printf() はプロンプトと入力された数値を表示するために使用されます。
  • %d は整数の書式指定子です。

この簡単なプログラムは、整数の入力を読み取る方法を示しており、これはセットビットカウントの演習の最初のステップです。

ビット演算を使って 1 の数を数える

このステップでは、C 言語のビット演算を使って整数のセットビット(1 のビット)の数を数える方法を学びます。

前の bit_counter.c ファイルを変更してビットカウントを実装しましょう。

cd ~/project
nano bit_counter.c

前の内容を以下のコードに置き換えます。

#include <stdio.h>

// Function to count set bits using bitwise AND operation
int countSetBits(int number) {
    int count = 0;

    while (number) {
        // Check the least significant bit
        count += number & 1;

        // Right shift the number
        number >>= 1;
    }

    return count;
}

int main() {
    int number;

    // Prompt the user to enter an integer
    printf("Enter an integer: ");
    scanf("%d", &number);

    // Count and display the number of set bits
    int setBitCount = countSetBits(number);
    printf("Number of set bits in %d: %d\n", number, setBitCount);

    return 0;
}

プログラムをコンパイルして実行しましょう。

gcc bit_counter.c -o bit_counter
./bit_counter

出力例:

Enter an integer: 42
Number of set bits in 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>

// Function to count set bits using bitwise AND operation
int countSetBits(int number) {
    int count = 0;

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

    return count;
}

int main() {
    int number;

    // Prompt the user to enter an integer
    printf("Enter an integer: ");
    scanf("%d", &number);

    // Count the number of set bits
    int setBitCount = countSetBits(number);

    // Print the count in multiple formats
    printf("Decimal Number: %d\n", number);
    printf("Binary Representation: ");

    // Print binary representation
    for (int i = 31; i >= 0; i--) {
        int bit = (number >> i) & 1;
        printf("%d", bit);
    }
    printf("\n");

    // Print set bit count results
    printf("Number of Set Bits: %d\n", setBitCount);
    printf("Set Bit Percentage: %.2f%%\n",
           (float)setBitCount / 32 * 100);

    return 0;
}

プログラムをコンパイルして実行しましょう。

gcc bit_counter.c -o bit_counter
./bit_counter

出力例:

Enter an integer: 42
Decimal Number: 42
Binary Representation: 00000000000000000000000000101010
Number of Set Bits: 3
Set Bit Percentage: 9.38%

コードの説明:

  • 2 進数表現の出力を追加しました。
  • セットビットの割合の計算を含めました。
  • ビット演算を使って個々のビットを抽出しました。
  • 出力を整形して、ビットカウントに関する複数の視点を提供しました。

このプログラムは、整数のビット構成に関する包括的な情報を提供し、以下を示します。

  • 10 進数の値
  • 32 ビットの完全な 2 進数表現
  • セットビットの総数
  • セットビットの割合

まとめ

この実験では、まず C 言語で整数の入力を読み取る方法を学びました。これには、ユーザー入力を取得するための scanf() 関数と、入力された数値を表示するための printf() 関数の使用が含まれていました。次に、与えられた整数のセットビット(1 のビット)の数を数えるためのビット演算を使った countSetBits() 関数を実装しました。この関数は、数値のビットを繰り返し処理し、ビット論理積演算を使って最下位ビットをチェックし、その後数値を右シフトして次のビットに移動します。セットビットのカウント数は累積され、返されます。