C ++中范围的按位OR(或-)

在这个问题中,我们给了两个整数值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开始,然后将一个数字增加到b,以找到所有数字的按位或。

更有效的解决方案,

这是一个更有效的解决方案,可以使用-

步骤1-找到a和b的MSB位,假设它们是MSBa和MSBb。

步骤2-检查MSBa是否等于MSBb。

步骤2.1-如果MSBa和MSBb相等。做,

步骤2.1.1-将结果的MSB设置为1。

步骤2.1.2-从a和b中减去MSB,这将是a和b的新值。转到步骤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

以上是 C ++中范围的按位OR(或-) 的全部内容, 来源链接: utcz.com/z/343393.html

回到顶部