C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で数値のパリティを効率的に求める方法を解説

パリティとは

この記事では、与えられた数値Nのパリティを求めるC++プログラムについて解説します。

パリティとは、数値を2進数で表したときに含まれる「1」の個数(セットビット数)を指します。

2進表現における「1」の個数が偶数であれば「偶数パリティ(Even Parity)」、奇数であれば「奇数パリティ(Odd Parity)」と呼ばれます。

効率的なアルゴリズム

与えられた数値をNとするとき、以下の手順で演算を行うことで、パリティを高速に求めることができます。

  • y = N ^ (N >> 1)
  • y = y ^ (y >> 2)
  • y = y ^ (y >> 4)
  • y = y ^ (y >> 8)
  • y = y ^ (y >> 16)

これらの演算をすべて実行した後、yの最下位ビット(右端のビット)がその数値のパリティを表します。最下位ビットが1であれば奇数パリティ、0であれば偶数パリティとなります。

この手法は「XOR畳み込み」と呼ばれるテクニックで、上位ビットと下位ビットを16ビット→8ビット→4ビット→2ビット→1ビットと段階的に折りたたむことで、32ビット整数のパリティをわずか5回のシフト演算とXOR演算で計算できます。ビットを1つずつ数える方法と比較して、処理速度が大幅に向上するのが特徴です。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
bool calc_parity(int N) {
    int y;
    y = N ^ (N >> 1);
    y = y ^ (y >> 2);
    y = y ^ (y >> 4);
    y = y ^ (y >> 8);
    y = y ^ (y >> 16);
    // 最下位ビットの確認
    if (y & 1)
        return 1;
    return 0;
}
int main() {
    int n = 1345;
    int result = calc_parity(n);
    if (result == 1)
        cout << "Odd Parity" << endl;
    else
        cout << "Even Parity" << endl;
    return 0;
}

実行結果

Even Parity

この例では、n = 1345(2進数で「10101000001」)に含まれる「1」の個数は4個(偶数)であるため、「Even Parity(偶数パリティ)」が出力されます。

  1. C++で三角形の重心を求めるプログラムの作成方法

    この記事では、三角形の3つの頂点の座標を格納した2次元配列が与えられたときに、その三角形の重心を求めるC++プログラムの作成方法を解説します。 三角形の重心とは、三角形の3本の中線がすべて交わる点のことです。 また、三角形の中線とは、ある頂点と、その対辺(向かい合う辺)の中点を結ぶ線分のことを指します。 それでは、具体的な例を使って問題を確認してみましょう。 入力 (-3, 1), (1.5, 0), (-3, -4) 出力 (-1.5, -1) 説明 重心 (x, y) = ((-3 + 1.5 - 3) / 3, (1 + 0 - 4) / 3) = (-1.5, -1) 解法のアプロ

  2. C++で平行四辺形の面積を求めるプログラムの作成方法

    この記事では、平行四辺形の底辺と高さを表す2つの値が与えられたとき、C++を使ってその面積を求めるプログラムを作成する方法を解説します。 平行四辺形とは? 平行四辺形とは、4つの辺からなる閉じた図形であり、向かい合う2組の辺がそれぞれ長さが等しく、互いに平行になっている四角形のことです。 問題を理解するための具体例 入力 B = 20, H = 15 出力 300 説明 平行四辺形の面積 = 底辺 × 高さ = 20 × 15 = 300 解決アプローチ この問題を解くには、平行四辺形の面積を求める幾何学の公式を使用します。 面積 = 底辺 × 高さ つまり、与えられた底辺と高さを掛け合わせ