在C ++中使用k个设置位最大化一个数字所需的最小翻转。

问题陈述

给定两个数字n和k,我们需要通过翻转位来找到使给定数最大化所需的最小翻转次数,以使结果数恰好具有k个设置位。请注意,输入必须满足以下条件:k <n中的位数。

  • 让我们假设n = 9和k = 2

  • 9的二进制表示是−1001。它包含4位。

  • 具有2个置位的最大4位二进制数是-1100,即12

  • 要将1001转换为1100,我们必须翻转高亮2位

算法

1. Count the number of bits in n. Let us call this variable as bitCount. we can use log2(n) function from math library as fllows:
   bitCount = log2(n) + 1;
2. Find largest number with k set bits as follows: maxNum = pow(2, k) - 1;
3. Find the largest number possible with k set bits and having exactly same number of bits as n as follows:
   maxNum = maxNum << (bitCount - k);
4. Calculate (n ^ maxNum) and count number of set bits.

示例

#include <iostream>
#include <cmath>
using namespace std;
int getSetBits(int n){
   int cnt = 0;
   while (n) {
      ++cnt;
      n = n & (n - 1);
   }
   return cnt;
}
int minFlipsRequired(int n, int k){
   int bitCount, maxNum, flipCount;
   bitCount = log2(n) + 1;
   maxNum = pow(2, k) - 1;
   maxNum = maxNum << (bitCount - k);
   flipCount = n ^ maxNum;
   return getSetBits(flipCount);
}
int main(){
   cout << "Minimum required flips: " << minFlipsRequired(9, 2) << "\n";
   return 0;
}

输出结果

当您编译并执行上述程序时。它产生以下输出-

Minimum required flips: 2