C++ 中的按位或 (或 - ) 运算符的范围
在这个问题中,我们得到了两个整数值 a 和 b。我们的任务是找到从 a 到 b 的范围内的按位或 (|) 运算结果。这意味着我们需要找到 a | a+1 | a+2 | … b-1 | b 的值。
让我们举个例子来理解这个问题:
输入 − a = 3 , b = 8
输出 − 15
解释 − 3 | 4 | 5 | 6 | 7 | 8 = 15
要解决这个问题,一个简单的解决方案是从 a 开始,通过将值增加 1 直到 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) 的所有位设置为 1。
步骤 3 − 打印结果。
现在,让我们看看上述算法的工作原理:
示例 − a = 3 且 b = 8。
解决方案 −
步骤 1 − MSBa = 1 ; MSBb = 3
步骤 2 − MSBa != MSBb,将结果从位位置 3 到位位置 0 的所有位设置为 1。结果 = (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
广告