C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++の極端な位置でビットを交換することにより、指定された符号なし数値を最大化します。


問題の説明

数値が与えられた場合、その極端な位置、つまり最初と最後の位置、2番目と2番目の最後の位置などでビットを交換することによって最大化します。

入力番号が8の場合、その2進表現は-

00000000 00000000 00000000 00001000

極端な位置でビットを交換した後、数値は-

になります
00010000 00000000 00000000 00000000 and its decimal equivalent is: 268435456

アルゴリズム

1. Create a copy of the original number
2. If less significant bit is 1 and more significant bit is 0 then swap the bits in the bit from only, continue the process until less significant bit’s position is less than more significant bit’s position
3. Return new number

#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
ull getMaxNumber(ull num){
   ull origNum = num;
   int bitCnt = sizeof(ull) * 8 - 1;
   int cnt = 0;
   for(cnt = 0; cnt < bitCnt; ++cnt, --bitCnt) {
      int m = (origNum >> cnt) & 1;
      int n = (origNum >> bitCnt) & 1;
      if (m > n) {
         int x = (1 << cnt | 1 << bitCnt);
         num = num ^ x;
      }
   }
   return num;
}
int main(){
   ull num = 8;
   cout << "Maximum number = " << getMaxNumber(num) << endl;
   return 0;
}

出力

上記のプログラムをコンパイルして実行する場合。次の出力を生成します-

Maximum number = 268435456

  1. 数値がC++で指定されたベースにあるかどうかを確認します

    数の文字列があるとすると、その数が指定された基数Bのものであるかどうかを確認する必要がありますか?文字列が「101110」、b =2の場合、プログラムはtrueを返します。文字列が「A8F」、ベースが16の場合、それは真になります。 アプローチは非常に簡単です。すべての文字が指定されたベースの記号の範囲内にある場合はtrueを返し、そうでない場合はfalseを返します。 例 #include <iostream> using namespace std; bool inGivenBase(string s, int base) {    if (base &g

  2. C++でkセットビットの数を最大化するために必要な最小フリップ。

    問題の説明 2つの数値nとkが与えられた場合、結果の数値が正確にkセットビットになるようにビットを反転することにより、指定された数値を最大化するために必要な最小の反転数を見つける必要があります。入力は、k