用 C++ 編寫一個高效的 C 程式來反轉一個數字的位


在這個問題中,我們得到一個無符號整數 n。我們的任務是建立一個程式,返回透過反轉該數字所有位而生成的數字。

我們舉一個例子來理解這個問題,

輸入

n = 1

輸出

2147483648

解釋

binary of 1 is 000...0001, the reverse is 100...0000.

為了解決這個問題,我們的簡單解決方案將使用一個簡單的公式。我們將迴圈遍歷該數字的二進位制。並且找到該數字中設定的位的位置,假設是 i。將使用以下公式計算結果:((total_number_of_bits) - 1) - i

程式顯示該演算法的實現,

示例

 即時演示

#include<iostream>
using namespace std;
unsigned int reverseBitNumber(unsigned int num) {
   unsigned int totalNumberOfBits = sizeof(num) * 8;
   unsigned int reverseNumber = 0, temp;
   for (int i = 0; i < totalNumberOfBits; i++){
      if((num & (1 << i)))
         reverseNumber |= (1 << ((totalNumberOfBits - 1) - i));
   }
   return reverseNumber;
}
int main() {
   unsigned int n = 21;
   cout<<"The number is "<<n<<endl;
   cout<<"The number which has reverse bits of the number is :"<<reverseBitNumber(n);
   return 0;
}

輸出

The number is 2
The number which has reverse bits of the number is :2818572288

方法 2

另一種方法是使用移位,我們將移位該數字的位,直到它變為零,然後將其移位回反向數字,然後將位移回剩餘次數以獲得結果。

程式顯示我們解決方案的實現,

示例

 即時演示

#include<iostream>
using namespace std;
unsigned int reverseBitNumber(unsigned int n){
   unsigned int rem_shift = sizeof(n) * 8 - 1;
   unsigned int reverseNubmer = n;
   n >>= 1;
   while(n){
      reverseNubmer <<= 1;
      reverseNubmer |= n & 1;
      n >>= 1;
      rem_shift--;
   }
   reverseNubmer <<= rem_shift;
   return reverseNubmer;
}
int main(){
   unsigned int n = 21;
   cout<<"The number is "<<n<<endl;
   cout<<"The number which has reverse bits of the number is :"<<reverseBitNumber(n);
   return 0;
}

輸出

The number is 21
The number which has reverse bits of the number is :2818572288

更新於:17-4-2020

938 次瀏覽

開啟您的 職業

完成該課程即可獲得認證

開始
廣告
© . All rights reserved.