C++で数値の指定した位置(インデックス)のビットを更新する方法
本記事では、数値の指定されたインデックス(位置)にあるビットを更新する問題を解説します。ビット操作(Bit Manipulation)を活用することで、数値の任意のビットを効率的に書き換えることができます。
例えば、以下のような入力を考えてみましょう。
入力:
N = 25 bit = 1 position = 2
出力:
29
解説: 入力値25は2進数で「11001」と表されます。ここで、位置インデックスは「2」、設定したいビット値は「1」です。指定位置のビットを置き換えると「11101」になり、これは10進数の「29」に相当します。
この問題へのアプローチ
数値の指定された位置(インデックス)にあるビットを、入力として与えられた特定のビット値に更新するのがこの課題の目的です。基本的な手順は、まず対象位置のビットをクリア(0に)し、その後にビット演算を行って新しいビットを設定するというものです。
- 数値N、更新するビット値「bit」、ビットを更新する位置「position」を入力として受け取ります。
- void関数 updateBit(int &n, int bit, int pos) が、現在の数値への参照、ビット値、ビットのインデックスを受け取ります。参照渡しにすることで、関数内での変更が呼び出し元の変数に反映され、更新後の数値を取得できます。
- まず、指定位置のビットをクリアします。「~(1 << pos)」でマスクを作成し、元の数値とAND演算することで、対象位置だけが0になった値を得ます。
- 次に、設定したいビット値を指定位置まで左シフトし、クリア済みの値とOR演算することで、新しいビットを反映させた結果を求めます。
サンプルコード
#include<iostream>
using namespace std;
void updateBit(int &n, int bit, int pos){
int clearBit = ~(1<<pos);
int mask = n & clearBit;
n = mask | (bit<<pos);
}
int main(){
int n = 25;
int bit = 1;
int pos = 2;
updateBit(n, bit, pos);
cout<<n;
}
実行結果
上記のコードを実行すると、次の出力が得られます。
29
入力値25は2進数で「11001」です。位置「2」のビットを「1」に置き換えると、2進数では「11101」となり、10進数では29になります。
-
C++で数値のK番目のセットビットの位置を求める方法
はじめに この記事では、2つの整数 N と K が与えられたとき、数 N の2進表現における右から K 番目のセットビット(値が「1」のビット)の位置(インデックス)を求める方法を解説します。 セットビットの確認は、数値を2進表現に変換して行います。インデックスは右端を 0 として数え始め、左へ向かって増加していきます。 たとえば、2進数「011101」の場合、右から 0 番目のインデックスには「1」、1 番目には「0」、というように各ビットが配置されています。 入出力例 入力: N = 6, K = 2 出力: 2 説明: 6 の2進表現は「0110」です。右から数えて 2 番目のセット
-
C++で配列内の数値の頻度(出現回数)を求める方法
配列に n 個の異なる要素が格納されているとします。この配列の中から、特定の要素が何回出現するか(頻度)を調べたい場合があります。例えば、配列 A = [5, 12, 26, 5, 3, 4, 15, 5, 8, 4] の中で「5」の頻度を調べると、答えは 3 になります。アルゴリズムの考え方この問題は、次の手順で解くことができます。1. 配列を左端から順に走査します。2. 現在の要素が調べたい数値と一致したら、カウンターを1つ増やします。3. 一致しない場合は、そのまま次の要素へ進みます。4. 配列の最後まで走査したら、カウンターの値が頻度となります。このアルゴリズムの計算量は O(n) で