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

C++で2つの数値の左端にある異なるビットの位置を求める方法

この問題では、2つの整数 num1num2 が与えられ、それぞれを2進数で表したときに初めて値が異なるビット、すなわち最も左側にある相違ビットの位置を求めます。

ビット同士を比較するためには、両者のビット長を揃える必要があります。これには、ビット数が少ない方の数値の先頭に0を補う(桁合わせを行う)方法が用いられます。

入出力例で問題を理解する

入力

num1 = 4, num2 = 7

出力

2

説明

4の2進表現は「100」、7の2進表現は「111」です。

左端のビットはどちらも「1」で一致していますが、左から2番目のビットは「0」と「1」で異なっています。したがって、求める位置は2となります。

解法のアプローチ

この問題を解く一つのアプローチは、まずビット数が少ない方の数値に 2(ビット数の差) を掛ける(=左シフトする)ことで、両者のビット数を揃えることです。その後、2つの数値のXOR(排他的論理和)を計算すると、ビットが異なる位置だけが1になります。このXOR結果の中で最上位に立っているビットをもとに、「全体のビット数 − XOR結果のビット数 + 1」という式で、左端から数えた相違ビットの位置を求めることができます。

アルゴリズム

ステップ1 ― ビット数が少ない方の数値に 2^(ビット長の差) を掛けて、両者のビット数を揃えます。

ステップ2 ― num1 と num2 のXOR演算を実行します。

ステップ3 ― 相違ビットの位置は「全体のビット数 − XOR結果のビット数 + 1」として求められます。

ソリューションの動作を示すプログラム

#include <iostream>
#include <math.h>
using namespace std;
int findmisMatchBit(int num1, int num2) {
    if (num1 == num2)
        return 0;
    int num1Size = floor(log2(num1)) + 1;
    int num2Size = floor(log2(num2)) + 1;
    int BitSizeDiff = abs(num1Size - num2Size);
    int maxBitSize = max(num1Size, num2Size);
    if (num1Size > num2Size)
        num2 *= pow(2, BitSizeDiff);
    else
        num1 *= pow(2, BitSizeDiff);
    int XOR = num1 ^ num2;
    int XORBitSize = floor(log2(XOR)) + 1;
    return (maxBitSize - XORBitSize + 1);
}
int main() {
    int num1 = 43, num2 = 765;
    cout<<"The position of leftmost dis-similar bit of the two
    number is "<<findmisMatchBit(num1, num2);
    return 0;
}

この例では、43の2進表現は「101011」(6桁)、765の2進表現は「1011111101」(10桁)です。43を4桁分だけ左シフトして桁を揃えた後にXORを取ると、最上位の相違ビットが左から何番目にあるかを計算できます。

出力

The position of leftmost dis-similar bit of the two number is 4

  1. 2つ以上の数値(配列)の最大公約数(GCD)を求めるC++プログラム

    2つの数の「公約数」とは、その両方の数を割り切ることができる数のことです。例えば、12の約数は 1、2、3、4、6、12 です。18の約数は 1、2、3、6、9、18 です。したがって、12と18の共通の約数(公約数)は 1、2、3、6 となり、その中で最も大きいものが「最大公約数(GCD: Greatest Common Divisor)」と呼ばれます。数学では、2つの整数 a と b の最大公約数は gcd(a, b) と表記され、この場合 gcd(12, 18) = 6 となります。最大公約数はさまざまな場面で重要な役割を果たします。例えば、2つの数の「最小公倍数(LCM: Least

  2. C++で3つ以上の数値(または配列)の最大公約数(GCD)を求める方法

    本記事では、3つ以上の数値の最大公約数(GCD)をC++で求める方法を解説します。2つの数値のGCDを求めるのは簡単ですが、3つ以上の数値を扱う場合はGCDの結合法則を利用します。例えば、{w, x, y, z} のGCDを求めたい場合、以下のように段階的に計算します。まず {gcd(w, x), y, z} を計算次に {gcd(gcd(w, x), y), z) を計算最後に {gcd(gcd(gcd(w, x), y), z)} を計算この手法を配列に適用すれば、任意の個数の数値に対してGCDを簡単に求めることができます。アルゴリズムgcd(a, b)begin