C ++で最大値を取得するには、2進数から1ビットを削除します
2進数が与えられる問題について話し合います。たとえば、残りの数が他のすべてのオプションの最大値になるように、少し削除する必要があります。
Input : N = 1011 Output: 111 Explanation: We need to remove one bit so removing 0 bit will give a maximum number than removing any 1’s bit. 111 > 101, 011. Input: 111 Output: 11 Explanation: Since all the bits are 1 so we can remove any bit.
解決策を見つけるためのアプローチ
ブルートフォース方式
ブルートフォースを適用すると、最大の結果数が得られます。つまり、各ビットを1つずつ削除し、さまざまな結果を比較して、最大の結果を得ることができます。
ただし、効率的なアプローチが1つあります。 使用できること、つまり、冗長性が最も少ないビットを削除した場合。
効率的なアプローチ
効率的なアプローチは、結果の数にほとんど影響を与えません。
-
まず、右からビットをトラバースします。
-
0を検索し、最初のカウンターで削除します。
-
0が見つからない場合は、任意のビットを削除します。
例
効率的なアプローチのためのC++コード
#include <bits/stdc++.h> using namespace std; int main(){ string str = "1011"; bool flag = false; int n = str.length(); // Initialising new array for char res[n - 1]; int j = 0; // traversing through the binary number from right. for (int i = 0; j < n - 1; i++) { // if 0 is found then skip it. if (str[i] == '0' && flag == false) { flag = true; continue; } else res[j++] = str[i]; } // printing the resulting string. cout << "Maximum number: " << res; return 0; }
出力
Maximum number: 111
上記のコードの説明
-
フラグ変数は、1つの0のみが削除されるように使用されます。
-
文字配列resは、結果の数値を格納するために初期化されます。
-
元の数より1つ少ない要素を格納する必要があるため、ループはn-1まで実行されます。
結論
このチュートリアルでは、1ビットを削除した後の最大数を見つける方法について説明しました。この問題を解決するための2つのアプローチについて説明しました。
また、同じC ++コードを記述しており、C、Java、Pythonなどの他の言語で記述できます。このチュートリアルがお役に立てば幸いです。
-
C++のバイナリ文字列から部分文字列010を削除するための最小手順
問題の説明 バイナリ文字列が与えられた場合、タスクは、このバイナリ文字列からサブ文字列010を削除するための最小ステップをカウントすることです 例 入力文字列が010010の場合、2つの手順が必要です 最初の0を1に変換します。これで文字列は110010になります 最後の0を1に変換します。これで最終的な文字列は110011になります アルゴリズム 1. Iterate the string from index 0 sto n-2 2. If in binary string has consecutive three characters ‘0’, &lsq
-
C++で数値の最上位セットビットを検索します
ここでは、数値が指定されているかどうか、次に設定されている最上位ビット値の値を見つける方法を確認します。値は2の累乗です。したがって、数値が10の場合、MSB値は8になります。 MSBの位置を見つけてから、k番目の位置にビットを設定して数値の値を見つける必要があります。 例 #include<iostream> #include<cmath> using namespace std; int msbBitValue(int n) { int k = (int)(log2(n)); return (int)(pow(2