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

C++の数値の2進表現で長さ>=nの連続する1を検索します


2つの整数xとnがあるとします。このタスクは、nの値以上の1の最初の連続ストリーム(32ビットバイナリ)を検索することです。長さを調整し、その位置を返します。そのような文字列が存在しない場合は、-1を返します。たとえば、x =35、n =2の場合、結果は31になります。32ビット整数での35のバイナリ表現は-

のようになります。

00000000000000000000000000100011。したがって、2つの連続する1がインデックス31に存在するため、答えは31です。

この問題を解決するには、先行ゼロの数を見つける必要があり、その数から、連続する1を見つけようとします。より良いアイデアを得るために例を見てみましょう。

#include<iostream>
using namespace std;
int leadingZeroCount(int x) {
   unsigned y;
   int n;
   n = 32;
   for(int i = 16; i > 1; i = i/2 ){
      y = x >> i;
      if(y != 0){
         n -= i;
         x = y;
      }
   }
   y = x >> 1;
   if (y != 0)
      return n - 2;
   return n - x;
}
int consecutiveOnePosition(unsigned x, int n) {
   int k, p;
   p = 0;
   while (x != 0) {
      k = leadingZeroCount(x);
      x = x << k;
      p = p + k;
      k = leadingZeroCount(~x);
      if (k >= n)
         return p + 1;
      x = x << k;
      p = p + k;
   }
   return -1;
}
int main() {
   int x = 35;
   int n = 2;
   cout << "Consecutive 1s of length " << n << " is starting from index: " << consecutiveOnePosition(x, n);
}

出力

Consecutive 1s of length 2 is starting from index: 31

  1. Nの基数B表現で後続ゼロの数を見つけます! C++を使用する

    この記事では、階乗のベースB表現で特定の数Nの後続ゼロを見つける問題を理解します。例 Input : N = 7 Base = 2 Output : 4 Explanation : fact(7) = 5040 in base10 and 1001110110000 in base16 having 4 trailing zero. Input : N = 11 Base = 5 Output : 2 Explanation : fact(11) = 39916800 in base10 and 40204314200 in base16 having 2 trailing zeroes.

  2. Nの基数16表現で後続ゼロの数を見つけます! C++を使用する

    この記事では、たとえば階乗の基数16の表現で特定の数Nの後続ゼロを見つける問題を理解します Input : N = 7 Output : 1 Explanation : fact(7) = 5040 in base10 and 13B0 in base16 having 1 trailing zero. Input : N = 11 Output : 2 Explanation : fact(11) = 39916800 in base10 and 2611500 in base16 having 2 trailing zeroes. まず、10進数を1つの基数から別の基数に変換するプロセ