0

繰り返しますが、問題を解決する方法に関する情報ではなく、問題の直接的なコードを求めているわけではありません。

以前、バイナリ コードで特定の整数をカウントすることについて質問しました。ここで、バイナリ コード内の最大ブロック長をカウントする方法についてお聞きしたいと思います。

正直なところ、入力された整数のバイナリ表現の「最大ブロック長」を計算するコードを記述して、どこから始めればよいのか、質問が正確に何を意味するのかを知りたいだけです。

例: 入力 456 出力: 111001000 1 の数: 4 最大ブロック長: ?

私がどこから来たのかを知る必要がある場合は、これまでの私のコードを参照してください。

#include <stdio.h>

int main(void)
{
  int integer; // number to be entered by user
  int i, b, n;
  unsigned int ones;
  printf("Please type in a decimal integer\n"); // prompt
  fflush(stdout);
  scanf("%d", &integer); // read an integer

  if(integer < 0)
  {
    printf("Input value is negative!"); // if integer is less than
    fflush(stdout);

    return;                  // zero, print statement
  }
  else{
    printf("Binary Representation:\n", integer);
    fflush(stdout);} //if integer is greater than zero, print statement

    for(i = 31; i >= 0; --i) //code to convert inputted integer to binary form
    {
      b = integer >> i;
      if(b&1){
        printf("1");
        fflush(stdout);
      }
      else{
        printf("0");
        fflush(stdout);
      }
    }
  printf("\n");
  fflush(stdout);
  ones = 0; //empty value to store how many 1's are in binary code
  while(integer)  //while loop to count number of 1's within binary code
  {
    ++ones;
    integer &= integer - 1;
  }
  printf("Number of 1's in Binary Representation: %d\n", ones); // prints number
  fflush(stdout);                                           //of ones in binary code
  printf("Maximum Block Length: \n");
  fflush(stdout);
  printf("\n");
  fflush(stdout);
  return 0;

}//end function main
4

4 に答える 4

3

1 の最長ランを探していると仮定します。

32ビットでそれを行う方法は次のとおりです。このアイデアを任意の長いビットストリームに拡張できるはずです。

int maxRunLen(uint32_t num) {
    int count = 0; 
    int maxCount = 0;
    while(num) {
       if(num & 1) count++;
       else {
           if( count > maxCount) maxCount = count;
           count = 0;
       }
       num >>=1;
    }
    if( count > maxCount) maxCount = count;
    return maxCount;
}

アイデアは、それが 1 であるかどうかを判断するために各ビットをテストすることです。1 の場合、カウントをインクリメントします。それ以外の場合は実行の終了です。この場合、前の実行が前の最大実行よりも長いかどうかを確認し、カウントをリセットします。

少しテストする方法は、マスキングを使用することです。上記の例では、テストされた最下位ビット

num & 1

数値の次のビットをテストするには、すべてのビットを 1 ビット右に移動します。これをシフトと呼びます。この場合、より明示的には、論理右シフト (>>) です。例のビット パターン 0110 は 0011 になります。これは上記の例で行われます。

num >>= 1;

これは次と同等です:

num = num >> 1;
于 2012-09-12T03:06:11.920 に答える
1

これを試して:

int max_run_of_ones (unsigned x)
{
  int max_run = 0;
  int cur_run;

  while (x != 0) {
    // skip right-most zeros                                                    
    while ((x & 1) == 0) {
      x >>= 1;
    }
    // skip and measure right-most run of ones                                  
    cur_run = 0;
    while ((x & 1) == 1) {
      cur_run++;
      x >>= 1;
    }
    if (cur_run > max_run) max_run = cur_run;
  }
  return max_run;
}
于 2012-09-12T03:33:48.480 に答える
0

コードを見ると、設定されているビット数を知りたいようです。これは推測です...

これは Ratko Tomic の功績によるものです。彼はビット操作が得意です。

int countBits( int 値 )
{
    int n = 0;

    if( 値 )
    {
        行う
        {
            n++;
        while( 0 != (値 = 値 & (値 - 1) ) );
    }
    戻ります ( n );
}
于 2012-09-12T02:55:37.307 に答える
0

これは、文字列操作を使用してPythonで解決する必要があります...

これの主なポイントは、あなたが達成しようとしていることを他の人が理解できるようにすることです.

import re    

number = 500
binary_repr = bin(number)[2:]             # '111110100'
blocks = re.split(r'0+', binary_repr)     # ['11111', '1', '']
block_lengths = [len(x) for x in blocks]  # [5, 1, 0]
maximum_block_length = max(block_lengths) # 5
于 2012-09-12T03:05:05.727 に答える