在 C++ 中通过重新排列位来使数字最大化


问题陈述

给定一个无符号数字,求出一个无符号数字的所有位都可以用来构成的最大数字

如果输入的数字是 8,那么它的二进制表示为−

00000000000000000000000000001000

为使其最大化,将 MSB 设置为 1。那么数字变为 2147483648,其二进制表示为−

10000000000000000000000000000000

算法

1. Count number of set bits in the binary representation of a given number
2. Find a number with n least significant set bits
3. shift the number left by (32 – n)

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
unsigned getMaxNumber(unsigned num){
   int n = __builtin_popcount(num);
   if (n == 32) {
      return num;
   }
   unsigned result = (1 << n) - 1;
   return (result << (32 - n));
}
int main(){
   unsigned n = 8;
   cout << "Maximum number = " << getMaxNumber(n) << endl;
   return 0;
}

输出

当您编译并执行以上程序时,它生成以下输出−

Maximum number = 2147483648

更新于: 24-12-2019

1095 次浏览

开启你的职业生涯

完成课程后获得认证

开始
广告