C++で整数の1の補数を見つける
このセクションでは、整数の1の完全なものを見つける方法を説明します。補数演算子を使用してこのタスクを非常に高速に実行できますが、32ビットの補数値(4バイト整数)になります。ここでは、nビット数の補数が必要です。
22という数値があるとします。2進数に相当するものは10110です。補完された値は01001で、これは9と同じです。ここで問題が発生します。この値を見つける方法は?最初に、与えられた数のビット数を見つける必要があります。カウントがcであると仮定します(ここでは、22の場合はc =5)。 51を作成する必要があります。したがって、これは11111になります。これを行うには、1を左にc回シフトし、そこから1を引きます。 1を左に5回シフトすると、100000になり、次に1を引くと、11111になります。その後、11111および10110とXOR演算を実行して、補数を取得します。
例
#include <iostream> #include <cmath> using namespace std; int findComplement(int n) { int bit_count = floor(log2(n))+1; int ones = ((1 << bit_count) - 1); return ones ^ n; } int main() { int number = 22; cout << "One's Complement of " << number << " is: " << findComplement(number); }
出力
One's Complement of 22 is: 9
-
C++の1の補数と同じ前の数値
この問題では、整数nが与えられます。私たちの仕事は、前の数字がその数字の1の補数に等しい天気をチェックすることです。 問題を理解するためにいくつかの例を見てみましょう Input: 12 Output: No Explanation: (12)10 = (1100)2 Preceding number 11 = (1011)2 1’s complement of 12 = (0011)2 Input: 4 Output: Yes Explanation: 4 = (100)2 Preceding number 3 = (011)2 1’s complement of
-
C++のセットビット数が1つ少ない以前の小さい整数
この問題では、整数nが与えられます。私たちのタスクは、数値の2進表現の1セットビットを変更することによって形成できるn未満の最大の数値を出力することです。 問題を理解するために例を見てみましょう Input: n = 3 Output: 2 Explanation: (3)10 = (011)2 Flipping one set bit gives 001 and 010. 010 is greater i.e. 2. この問題を解決するには、右端のセットビットを反転してゼロにする必要があります。これにより、数値の1ビットを反転して検出されるn未満の可能な最大の数値が作成されます。 ソリ