C++で2進数表現におけるk番目のビットの値を求める方法
問題概要
この問題では、2つの整数 n と k が与えられ、n の2進数表現における k 番目のビットの値を求めることが課題となります。
具体例で理解しよう
入力:n = 5, k = 2 出力:0
解説:
5 の2進数表現 = 0101 最下位ビット(LSB)から数えて2番目のビットは 0 です。
解法のアプローチ
この問題は、ビット演算を使うことで効率的に解くことができます。手順は以下の通りです。
- k 番目のビットだけが 1 になっている数(つまり「1」を (k−1) 回左シフトした値)を作成します。
- その数と n のビットごとの AND(論理積)を計算します。これにより、k 番目以外のビットはすべて 0 になります。
- 結果を (k−1) ビット右にシフトすると、k 番目のビットの値(0 または 1)がそのまま得られます。
C++での実装例
以下は、上記の解法を実装した C++ プログラムです。
#include <iostream>
using namespace std;
void findKBitVal(int n, int k){
cout << ((n & (1 << (k - 1))) >> (k - 1));
}
int main(){
int n = 29, k = 4;
cout << "The value of kth bit in binary of the number is ";
findKBitVal(n, k);
return 0;
}
出力結果
The value of kth bit in binary of the number is 1
まとめ
ビット演算(AND とシフト)を組み合わせることで、O(1) の時間計算量で任意の位置のビット値を取得できます。このテクニックは、フラグ管理やビットマスク処理など、競技プログラミングやシステム開発のさまざまな場面で応用される基本操作なので、ぜひマスターしておきましょう。
-
C++で二分木の最下層・左端の値を求める方法
二分木が与えられたとき、その木の最も深い行(最下層)における左端の値を求める問題を考えてみましょう。例えば、次のような二分木があるとします。 この場合、最下層は [7, 4] であり、その中で最も左にある要素は 7 なので、出力は 7 となります。 解法のアプローチ この問題は、深さ優先探索(DFS)を利用することでシンプルに解くことができます。ポイントは「必ず左側の子ノードから先に訪問する」ことです。こうすることで、それまでに到達した中で最も深いレベルへ最初に到達したノードが、自動的にそのレベルの左端のノードになります。 アルゴリズムの手順 最初に、答えを格納する ans と、現在の最大
-
C++の二分探索木(BST)で最小値のノードを見つける方法
二分探索木(Binary Search Tree、BST)が与えられたとき、その木の中から最小の要素を見つけることを考えます。例えば、以下のようなBSTがあるとします。この場合、最小要素は 1 になります。考え方二分探索木の重要な性質として、左部分木には必ず親ノードより小さい値が格納されるというものがあります。この性質を利用すると、次の手順で最小要素を見つけることができます。ルートノードから探索を開始します。現在のノードの左の子が NULL でない間、左の子へ移動を繰り返します。左の子が NULL になったノードの値が、木全体の中で最小の要素です。この操作の計算量は木の高さに依存し、平衡な二分