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

C ++の範囲のビットごとのOR(または-)


この問題では、2つの整数値aとbが与えられます。そして、私たちのタスクは、aからbまでの範囲のビットごとのOR(|)を見つけることです。これは、|の値を見つける必要があることを意味しますa + 1 | a + 2 | …b-1| b。

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

入力 − a =3、b =8

出力 − 15

説明 − 3 | 4 | 5 | 6 | 7 | 8 =15

この問題を解決するための簡単な解決策は、aから開始し、1をbに増やして、すべての数値のビット単位のORを見つけることです。

より効果的なソリューション

これはより効果的な解決策です。これは-

を使用して実行できます。

ステップ1 − aとbの両方のMSBビットを見つけます。たとえば、MSBaとMSBbです。

ステップ2 −MSBaがMSBbと等しいかどうかを確認します。

ステップ2.1 −MSBaとMSBbが等しい場合。やる、

ステップ2.1.1 −結果のMSBを1に設定します。

ステップ2.1.2 −aとbの新しい値となるaとbからMSBを引きます。手順1に進みます。

ステップ2.2 −MSBaとMSBbが等しい場合。やる、

ステップ2.2.1 −結果の0からmax(MSBa、MSBb)までのすべてのビットを設定します。

ステップ3 −結果を印刷します。

さて、上記のアルゴリズムが機能しているところを見てみましょう-

− a=3およびb=8。

解決策

ステップ1 − MSBa =1; MSBb =3

ステップ2 − MSBa!=MSBb、結果のビット位置3からビット位置0までのすべてのビットを1に設定します。result=(1111)2 =15

それでは、問題を解決するためのコードを見てみましょう。

#include <iostream>
using namespace std;
int FindpositionMSB(long long int n){
   int MSBval = -1;
   while (n) {
      n = n>>1;
      MSBval++;
   }
   return MSBval;
}
long int CalcBitwiseORRaneg( long int a, long int b) {
   long int result = 0;
   int msba = FindpositionMSB(a);
   int msbb = FindpositionMSB(b);
   while (msba == msbb) {
      long int value = (1 << msba);
      result += value;
      a -= value;
      b -= value;
      msba = FindpositionMSB(a);
      msbb = FindpositionMSB(b);
   }
   msba = max(msba, msbb);
   for (int i = msba; i >= 0; i--) {
      long int res_val = (1<<i);
      result += res_val;
   }
   return result;
}
int main() {
   long int a = 3, b = 8;
   cout<<"The bitwise OR (|) of all integers in the range from "<<a<<" to "<<b<<" is "<<CalcBitwiseORRaneg(a, b);
   return 0;
}

出力

The bitwise OR (|) of all integers in the range from 3 to 8 is 15

  1. C ++のビットごとのORとは何ですか?

    ビットごとのOR演算子(|)は、第1オペランドの各ビットを第2オペランドの対応するビットと比較します。いずれかのビットが1の場合、対応する結果ビットは1に設定されます。それ以外の場合、対応する結果ビットは0に設定されます。ビット単位の包括的OR演算子の両方のオペランドは、整数型である必要があります。たとえば、 例 #include <iostream>   using namespace std;   int main() {      unsigned short a = 0x5555;      /

  2. C++のビット演算子

    c++では3つのビット単位の演算子を使用できます。これらは、ビット単位のAND(&)、ビット単位のOR(|)、およびビット単位のXOR(^)です。 ビットごとのAND演算子(&)は、第1オペランドの各ビットを第2オペランドの対応するビットと比較します。両方のビットが1の場合、対応する結果ビットは1に設定されます。それ以外の場合、対応する結果ビットは0に設定されます。ビット単位の包括的AND演算子の両方のオペランドは、整数型である必要があります。たとえば、 例 #include <iostream>   using namespace std;   int mai