C++で数値の最上位セットビット(MSB)の値を求める方法
この記事では、与えられた数値に対して、最上位セットビット(MSB:Most Significant Bit)の値を求める方法を解説します。MSBの値は必ず2のべき乗になります。例えば、数値が10であれば、MSBの値は8です。
手順としては、まずMSBが何番目のビットに立っているか(位置k)を求め、その位置にセットビットが立った数値、すなわち 2k を計算します。
実装例
以下のC++コードでは、log2 関数でMSBの位置を求め、pow 関数で2のべき乗を計算しています。
#include<iostream>
#include<cmath>
using namespace std;
int msbBitValue(int n) {
int k = (int)(log2(n));
return (int)(pow(2, k));
}
int main() {
int n = 150;
cout << "MSB bit value is: " << msbBitValue(n);
}実行結果
MSB bit value is: 128
コードの解説
数値150を2進数で表すと「10010110」です。最上位のセットビットは7番目の位置にあるため、MSBの値は 27 = 128 となります。log2(n) の結果を整数にキャストすることで、MSBの位置kが求まります。
別のアプローチ:ビットシフトを使う方法
log2 や pow を使わずに、ビットシフトだけでMSBの値を求めることもできます。nを1ビットずつ右シフトしながらシフト回数を数え、最後に1を同じ回数だけ左シフトして戻します。
#include<iostream>
using namespace std;
int msbBitValue(int n) {
int k = 0;
while (n > 1) {
n = n >> 1;
k++;
}
return 1 << k;
}
int main() {
int n = 150;
cout << "MSB bit value is: " << msbBitValue(n);
}この方法なら、浮動小数点演算による誤差の心配もなく、より安全にMSBの値を取得できます。
-
C++で配列内の最小値の出現回数(頻度)を求める方法
この記事では、配列の中で最小の要素が何回出現するか(頻度)を求める方法を解説します。例として、配列の要素が [5, 3, 6, 9, 3, 7, 5, 8, 3, 12, 3, 10] である場合を考えてみましょう。この配列の最小値は 3 であり、その出現回数は 4 回です。したがって、出力は 4 となります。解決のアプローチこの問題を解く手順は非常にシンプルで、以下の2ステップで構成されます。1. まず、配列全体を走査して最小値を見つける2. 次に、その最小値と一致する要素の個数を数えるこの方法の時間計算量は O(n) であり、配列を2回走査しますが、線形時間で処理が完了するため効率的です。
-
C++で有理数の最小公倍数(LCM)を求める方法
本記事では、有理数(分数)の最小公倍数(LCM)を求める方法を解説します。例えば、{2/7, 3/14, 5/3} という有理数のリストが与えられた場合、そのLCMは 30/1 となります。 有理数のLCMを求める公式 この問題を解くには、まずすべての分子のLCM(最小公倍数)を計算し、次にすべての分母のGCD(最大公約数)を計算します。有理数のLCMは、次の式で表されます。 $$LCM = \frac{すべての分子のLCM}{すべての分母のGCD}$$ 各分数の倍数となる有理数は、分子がすべての分子の公倍数であり、かつ分母がすべての分母の公約数である必要があります。その中で最小のものが「分子