Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

整数のセットビット(1のビット)を数えるC/C++プログラム

本記事では、整数を2進数で表したときに「1」となっているビット(セットビット)の個数を数える方法を解説します。セットビットとは、数値のバイナリ表現における1のビットのことです。たとえば、13は2進数で「1101」と表されるため、セットビットは3個になります。

この問題を解くには、数値を右シフトしながら最下位ビット(LSb)を調べ、1であればカウントを増やします。これを数値が0になるまで繰り返すことで、セットビットの総数を求められます。

アルゴリズム

countSetBit()

begin
    count := 0
    while n is not 0, do
        if LSb of n is set, then
            count := count + 1
        end if
        n := n after shifting 1 bit to right
    done
    return count
end

実装例

以下は、CおよびC++で動作する実装例です。ビット演算子 & で最下位ビットを判定し、>> で1ビットずつ右にずらしていきます。

#include<iostream>
using namespace std;
int count_set_bit(int n) {
    int count = 0;
    while(n != 0) {
        if(n & 1 == 1) {
            count++;
        }
        n = n >> 1; //右へ1ビットシフト
    }
    return count;
}
int main() {
    int n;
    cout << "Enter a number: ";
    cin >> n;
    cout << "Number of set bits: " << count_set_bit(n);
}

出力例

Enter a number: 29
Number of set bits: 4

入力した値が29の場合、2進数では「11101」となるため、セットビットは4個と正しく出力されます。

計算量について

この手法では、数値が0になるまで1ビットずつ確認するため、時間計算量はビット長に比例するO(log n)となります。より高速に処理したい場合は、GCC/Clangで利用できる組み込み関数 __builtin_popcount(n) を使う方法や、Brian Kernighanのアルゴリズム(最も右にある1のビットを順に消去していく手法)を使うと、セットビットの数だけしかループが回らないため効率的です。

  1. C/C++でn番目のカタラン数を求めるプログラム

    カタラン数(Catalan numbers)とは、組み合わせ論におけるさまざまな数え上げ問題に現れる自然数の数列です。特に、再帰的に定義される対象の個数を数える場面で頻繁に登場することで知られています。カタラン数の主な性質ディック語(Dyck word)との関係Cn は、長さ 2n のディック語の総数を表します。ディック語とは、n 個の X と n 個の Y から構成され、文字列のどの先頭部分を見ても Y の数が X の数を超えない文字列のことです。例えば、長さ 6 のディック語は次の通りです。XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY.正しい括弧の対応付けX を開き

  2. C言語で浮動小数点数のセットビット数を数える方法を解説

    この問題では、1つの浮動小数点数が与えられ、その2進表現におけるセットビット(1になっているビット)の数を求める必要があります。例えば、浮動小数点数が 0.15625 の場合、セットビットは6個になります。一般的なCコンパイラでは、単精度浮動小数点形式で数値が表現されるため、メモリ上では次のようなビット列として格納されます。考え方:ポインタとバイト単位での処理浮動小数点数をビット値に変換して調べるには、まず対象の数値をポインタ変数に渡し、そのポインタを char* 型にキャストします。こうすることで、float型のデータを1バイトずつ順番に処理できるようになり、各バイト(char型)ごとのセッ