编写高效的C程序以反转C ++中的数字位

在这个问题中,我们得到一个无符号整数n。我们的任务是创建一个程序,该程序返回通过反转数字的所有位生成的数字。

让我们举个例子来了解这个问题,

输入值

n = 1

输出结果

2147483648

说明

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

为了解决这个问题,我们简单的解决方案将使用一个简单的公式。我们将遍历数字的二进制数。并找到设置位在数字中的位置,让我说。将使用公式(((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<<"该数字具有反向比特的数字是:"<<reverseBitNumber(n);
   return 0;
}

输出结果

The number is 2
该数字具有反向比特的数字是: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<<"该数字具有反向比特的数字是:"<<reverseBitNumber(n);
   return 0;
}

输出结果

The number is 21
该数字具有反向比特的数字是:2818572288