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

C++で整数の未設定ビット(0のビット)を数える方法

整数値(例:num)が与えられたとき、まずその数値を2進数に変換し、次に含まれる未設定ビットの総数を求めるのが本記事の目的です。

2進数における未設定ビットとは「0」で表されるビットのことです。整数を2進数に変換すると、必ず0と1の組み合わせになります。コンピュータの用語では、この「0」を未設定ビット(unset bit)、「1」を設定ビット(set bit)と呼びます。

入出力例

入力: int number = 50
出力: 数値に含まれる未設定ビットの総数は 5

説明: 50の2進表現は 110010 です。これを8桁の2進数として表すと、先頭に2つの0が追加されて 00110010 となります。設定ビット(1)が3個あるため、未設定ビットは 8 − 3 = 5 個です。

入力: int number = 10
出力: 数値に含まれる未設定ビットの総数は 6

説明: 10の2進表現は 1010 です。8桁で表すと 00001010 となり、先頭に4つの0が追加されます。設定ビットが2個のため、未設定ビットは 8 − 2 = 6 個です。

プログラムで使うアプローチ

  • 整数型の変数に、対象となる数値を入力として受け取る。

  • カウンターを格納するため、unsigned int 型の変数 total_digits と count を宣言する。

  • forループを i = 1 << 7 から開始し、i > 0 の間、i を毎回半分(i / 2)にしながら繰り返す。

  • ループ内では、number & i が真であれば「1」、偽であれば「0」を出力し、total_digits をインクリメントする。

  • 続いてwhileループで、number が 0 になるまで count += number & 1 および number >>= 1 を実行し、設定ビットの総数を数える。

  • 最後に count = 総ビット数 − 設定ビット数 として未設定ビットの総数を求め、結果を出力する。

サンプルコード

#include<iostream>
using namespace std;
//数値に含まれる未設定ビットの総数をカウントする関数
unsigned int unset_bits(unsigned int number){
    unsigned int total_digits = 0;
    unsigned int count = 0;
    unsigned int i;
    //8桁の2進数を表示する
    cout<<"8-bit digits of "<<number<<" is: ";
    for (i = 1 << 7; i > 0; i = i / 2){
        (number & i) ? cout<<"1" : cout<<"0";
        total_digits++;
    }
    //設定ビット(1)の総数をカウントする
    while (number){
        count += number & 1;
        number >>= 1;
    }
    //未設定ビット数 = 総ビット数 − 設定ビット数
    count = total_digits - count;
    cout<<" Count of total unset bits in a number are: "<<count;
}
int main(){
    int number = 50;
    unset_bits(number);
    return 0;
}

実行結果

上記のコードを実行すると、次の出力が得られます。

8-bit digits of 50 is: 00110010
Count of total unset bits in a number are: 5

コードのポイント

マスク用の定数 1 << 7(=128)は、最上位ビットだけが立った値です。これと number の論理積(AND)を取りながら右へずらしていくことで、最上位ビットから順に各ビットが1か0かを判定できます。

一方、whileループ内の number & 1 は最下位ビットを取り出す操作です。number を1ビットずつ右シフトしながら最下位ビットを加算していけば、設定ビットの総数が得られます。

全体の処理はビット幅分(ここでは8回)のループで完結するため、時間計算量は O(log n)、空間計算量は O(1) と非常に効率的です。この手法は、符号チェックやデータ圧縮、ネットワークのサブネット計算など、ビット単位の判定が必要な場面で広く応用されています。

  1. C++とOpenCVで動画の総フレーム数をカウント・取得する方法

    はじめにこの記事では、OpenCVを使って動画の総フレーム数を求める方法を解説します。OpenCVを利用すれば、動画の総フレーム数を数えて表示するのは非常に簡単です。ただし、一点だけ注意が必要です。リアルタイム映像(Webカメラの映像など)のフレーム数は数えることができません。リアルタイム映像には決まったフレーム数が存在しないためです。以下のプログラムでは、動画ファイルの総フレーム数をカウントし、コンソール画面に表示します。サンプルコード#include<opencv2/opencv.hpp> #include<iostream> using namespace std

  2. 【C++】長方形に含まれる正方形の総数を求めるアルゴリズムと実装

    縦の長さL、横の幅B(L≥B)の長方形が与えられたとします。この記事では、L×Bの長方形の中にいくつの正方形が含まれているかを効率的に求める方法を解説します。 上の図は3×2の長方形の例です。この長方形には、2×2の正方形が2個、1×1の正方形が6個含まれています。 合計:6+2=8個 規則性を見つける まず、正方形だけで構成されたB×Bの図形について考えてみましょう。 サイズL×Bの長方形には、必ずL×B個の1×1の正方形が含まれます。 含まれる最大の正方形のサイズはB×Bです。 L=B=1の場合:正方形の数=1 L=B=2の場合:正方形の数=1+4=5(2×2が1個、1×1が4個) L