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

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

  1. 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

  2. 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未満の可能な最大の数値が作成されます。 ソリ