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

C++で2つのバイナリの合計が最初にキャリーされる右端のビットの位置


この問題では、2つの正の整数NとMが与えられます。私たちのタスクは、NとMの合計の2進加算で最初のキャリービットを生成する右端のビットを出力することです。 。

問題を理解するために例を見てみましょう

入力 − n =5、M =14

出力 − 3

説明

(5)2 = 0101 , (14)2 = 1110
Sum 0101
+   1110
    10011

この問題を解決するために、ブール代数からのいくつかの観測を検討します。

両方の数値が1の場合、合計によってキャリーが生成されます。したがって、キャリーが生成されるすべてのビットが見つかります。これは、両方の数値のと操作を見つけることによって行われます。そして、数字の右端のビットを見つけます。

これを理解するには少し複雑に思えます。この方法を使用して例を解いてみましょう。

N = 5 and M = 14
N&M = 0100

ここで右端のセットビットはインデックス3にあります。

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

#include <iostream>
#include <math.h>
using namespace std;
int rightSetBit(int N) {
   int bitIndex = log2(N & -N)+1;
   return bitIndex;
}
void rightCarryBit(int N, int M) {
   int carryIndex = rightSetBit(N & M);
   cout<<carryIndex;
}
int main() {
   int N=4, M=14;
   cout<<"The position of rightmost bit that generates carry in the sum of "<<N<<" and "<<M<<" is ";
   rightCarryBit(N,M);
   return 0;
}

出力

The position of rightmost bit that generates carry in the sum of 4 and 14 is 3

  1. C++で2つの二分木をマージする

    2つの二分木があり、一方をもう一方を覆うように配置すると、2つのツリーの一部のノードがオーバーラップし、他のノードがオーバーラップするとします。それらを新しいバイナリツリーにマージする必要があります。マージルールは、2つのノードがオーバーラップしている場合、ノード値を合計して、マージされたノードの新しい値として計算するようなものです。それ以外の場合は、空でないノードが新しいツリーのノードとして使用されます。 したがって、木が- その場合、出力は-になります これを解決するには、次の手順に従います- メソッドはmergeTrees()です。これは、2つのツリーノードn1と

  2. C++の2つの二分木で最初の一致しない葉を見つけます

    2つの二分木があるとします。一致しない2本の木の最初の葉を見つける必要があります。一致しない葉がない場合は、何も表示しません。 これらが2つのツリーである場合、最初の一致しない葉は11と15です。 ここでは、スタックを使用して、両方のツリーの反復プレオーダートラバーサルを同時に使用します。ツリーごとに異なるスタックを使用します。トップノードがリーフノードになるまで、ノードをスタックにプッシュします。 2つのトップを比較し、同じ場合はさらにチェックし、そうでない場合は2つのスタックトップ要素を表示します。 例 #include <iostream> #include <