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

更新於: 2020-08-05

833 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告