C++で数値のパリティを効率的に求める方法
このチュートリアルでは、C++を使って数値のパリティ(偶奇性)を効率的に求めるプログラムを作成します。
パリティとは、数値を2進数で表したときに「1」が現れる回数が偶数か奇数かを示すものです。通常、1ビットずつ確認する方法では計算に時間がかかりますが、XOR(排他的論理和)と右シフト演算子を組み合わせることで、わずか数ステップで高速に求められます。
パリティを求めるアルゴリズム
以下の手順で、XORと右シフト演算を繰り返し適用することで、32ビット整数のパリティを効率的に計算できます。
int b; b = n ^ (n >> 1); b = b ^ (b >> 2); b = b ^ (b >> 4); b = b ^ (b >> 8); b = b ^ (b >> 16);
この処理により、すべてのビットの情報が最下位ビットに集約されます。最終的な結果の最下位ビットが 0 であれば偶数パリティ、1 であれば奇数パリティであると判定できます。
実装例
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
void findParity(int n) {
int b;
b = n ^ (n >> 1);
b = b ^ (b >> 2);
b = b ^ (b >> 4);
b = b ^ (b >> 8);
b = b ^ (b >> 16);
if ((b & 1) == 0) {
cout << "Even Parity" << endl; // 偶数パリティ
}
else {
cout << "Odd Parity" << endl; // 奇数パリティ
}
}
int main() {
int n = 15;
findParity(n);
return 0;
}実行結果
上記のコードを実行すると、次のような出力が得られます。
Even Parity
この例では入力値が 15(2進数で 1111)であり、「1」が4個、つまり偶数個含まれているため、結果は「偶数パリティ」となります。
まとめ
XORと右シフトを組み合わせた手法を使えば、ビットごとのカウントを行うことなく、定数時間でパリティを判定できます。組み込みシステムや通信分野での誤り検出など、パフォーマンスが求められる場面で特に有効なテクニックです。チュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。
-
C++で文字列の部分文字列の総数を求める方法を解説
この記事では、与えられた文字列から作成できる空でない部分文字列の個数を求める方法について解説します。入力 : string = "moon" 出力 : 10 説明 : 部分文字列は m、o、o、n、mo、oo、on、moo、oon、moon の 10 個です。 入力 : string = "yellow" 出力 : 21解法のアプローチ文字列の長さを n とします。上の例からも分かるように、考えられるすべての部分文字列の個数を求めるには、長さ n、(n-1)、(n-2)、(n-3)、……2、1 の部分文字列の個数を順に加算していく必要があります。部分文
-
C++で列車の停車駅の組み合わせ数を求める方法
地点XとYの間にはn個の中間駅があるとします。ここで、「どの2つの停車駅も隣り合わない」という条件のもとで、s個の駅に停車する列車の配置方法が何通りあるかを求める問題を考えてみましょう。この記事では、停車駅の組み合わせ数を求めるためのアプローチを段階的に詳しく解説します。この問題は、本質的には組合せ論の問題であり、s個の停車駅の選び方の総数を求めることになります。 問題を解くアプローチ まず具体例として、中間駅が8個あり、そのうち3個の駅に停車させたい場合を考えてみます。 n = 8, s = 3 このとき、列車が停車できない駅は(n − s)、つまり5個残ることになります。 停車できない