C++で数値のK番目の最下位ビット(LSB)を出力する方法
この記事では、与えられた整数 n の k 番目の最下位ビット(LSB:Least Significant Bit)を求めて出力する方法を、C++のコード例とともにわかりやすく解説します。
問題の概要
2つの整数 n と k が与えられたとき、n を2進数で表した際の「下から k 番目」のビットの値(0 または 1)を出力するのが課題です。
入出力例
入力: n = 12 , k = 3 出力: 1
解説: n = 12 の2進表現は「1100」です。ビットは右側(最下位)から数えるため、下から3番目のビットは 1 となります。
解き方のアプローチ
この問題は、ビット演算を利用することで非常に効率的に解けます。手順は次の通りです。
- 数値 1 を左に (k−1) ビットシフトし、k 番目のビットだけが立った「マスク」を作成します。
- 元の数値 n とこのマスクとのビットごとの論理積(AND)を計算します。
- 結果が 0 以外であれば k 番目のビットは 1、0 であれば k 番目のビットは 0 であると判定できます。
C++での実装例
以下のコードは、上記の解法を実装したものです。
#include <bits/stdc++.h>
using namespace std;
int main() {
int N = 12, K = 3;
cout<<K<<"th significant bit of "<<N<<" is : ";
bool kthLSB = (N & (1 << (K-1)));
cout<<kthLSB;
return 0;
}
実行結果
3th significant bit of 12 is : 1
コードのポイント解説
重要なのは式 (N & (1 << (K-1))) の部分です。1 << (K-1) によって K 番目のビットのみが 1 になったマスクが生成され、N との AND 演算により他のすべてのビットが消去されます。この結果を bool 型の変数で受け取ることで、対象のビットが立っていれば true(1)、立っていなければ false(0)として出力されます。
-
C++で解く:範囲内のK番目のビットがセットされた配列要素の数を求めるクエリ処理
はじめに 本記事では、指定された範囲内に存在する要素のうち、K番目のビットがセット(1)になっている要素の個数を求める問題について解説します。まずは具体例を見てみましょう。 入力 : arr[] = { 4, 5, 7, 2 } クエリ1: L = 2, R = 4, K = 4 クエリ2: L = 3, R = 5, K = 1 出力 : 0 1 まずは総当たり(ブルートフォース)のアプローチでこの問題を解き、その手法が大きな制約値に対しても実用的かどうかを確認します。もし不十分であれば、より効率
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の