数値のパリティチェック|2進数の1の個数から偶数・奇数を判定する方法
パリティとは
数値のパリティは、その数値を2進数に変換したときに含まれる「1」の個数によって決まります。「1」の個数が奇数であれば奇数パリティ、偶数であれば偶数パリティと判定されます。
コンピュータのメモリ上では、数値はすべて2進数として格納されているため、ビットシフト操作を使えば簡単に各ビットを調べることができます。この記事では、ビットを右へシフトしながら、与えられた数値の2進表現に含まれる「1」の個数を数え、パリティを求める方法を解説します。
入力と出力
入力:
数値: 5
2進数表現は (101)
出力:
5 のパリティは 奇数 です。
アルゴリズム
findParity(n)
入力: 判定対象の数値 n。
出力: その数値が偶数パリティか奇数パリティかの結果。
Begin
count := 0
temp := n
while temp >= 2, do
if temp の LSb(最下位ビット)が 1 ならば
count := count + 1
temp を 1 ビット右シフトする
done
if count が奇数ならば
奇数パリティと表示
else
偶数パリティと表示
End
手順の解説
- カウンタ変数 count を 0 で初期化し、temp に n を代入します。
- temp が 2 以上である間、最下位ビット(LSb)が 1 であれば count を 1 増やします。
- temp を 1 ビット右シフトし、すべてのビットを確認できるまで繰り返します。
- ループ終了後、count が奇数なら「奇数パリティ」、偶数なら「偶数パリティ」と判定します。
C++による実装例
#include <iostream>
using namespace std;
bool findParity(int n) {
int count = 0;
int temp = n;
while (temp>=2) {
if(temp & 1) // 最下位ビットが 1 の場合、カウントを増やす
count++;
temp = temp >> 1; // 数値を 1 ビット右シフトする
}
return (count % 2)?true:false;
}
int main() {
int n;
cout << "Enter a number: "; cin >>n;
cout << "Parity of " << n << " is " << (findParity(n)?"Odd":"Even");
}
実行結果
Enter a number: 5
Parity of 5 is Odd
補足: より効率的な方法
上記の実装では、ビット長の分だけループを回す必要があります。一方、Brian Kernighan のアルゴリズムを利用すると、「n & (n-1)」という演算で最下位にある 1 を順番に消去していけるため、ループ回数は「1」の個数分だけで済みます。大きな数値を扱う場合には、この手法の方が高速にパリティを求められるので覚えておくと便利です。
-
C++で数値が別の数値の累乗であるかどうかを判定する方法
この記事では、ある数値が別の数値の累乗として表せるかどうかを判定する方法を解説します。例えば、125 と 5 という2つの数値が与えられた場合、125 が 5 の累乗であれば true を返します。実際、125 = 53 なので、この場合は true となります。判定の考え方はシンプルです。基数 x の累乗値を順番に計算していき、目的の数値 y に一致するかどうかを確認します。一致すれば「表せる」、y を超えてしまえば「表せない」と判断できます。アルゴリズム手順は以下の擬似コードの通りです。特別なケースとして、x が 1 の場合は y も 1 のときのみ true を返します(1 の累乗は常に
-
C#で数値が2の累乗かどうかを判定する方法をわかりやすく解説
「2の累乗」とは、整数 n を用いて 2n の形で表せる数のことです。つまり、基数を2、指数を整数 n としてべき乗計算を行った結果の値を指します。代表的な2の累乗は以下の表のとおりです。n2n01122438416532このように、n = 0 のときは 20 = 1 となる点に注意してください。1 もまた2の累乗に含まれます。C#で数値が2の累乗かどうかを判定するには、主に2つのアプローチがあります。それぞれサンプルコードとともに見ていきましょう。方法1:ビット演算を使う(高速・定番)2の累乗である数をバイナリで表すと、最上位ビットだけが1になり、それ以外はすべて0になります。例えば、8 は