在这个问题中,我们得到一个无符号整数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
另一种方法是使用移位,我们将数字的位移位直到其变为零,然后将它们反向移位,然后将剩余的位移位数次以获得结果。
显示我们解决方案实施情况的程序,
#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