如何计算二进制数C的最大块长度

时间:2012-09-12 02:41:59

标签: c binary block

我想重申一个事实,即我不是要求直接编写我的问题代码,而不是想要了解如何达到该解决方案的信息。

我之前问过一个关于计算二进制代码中特定整数的问题。现在我想问一下如何计算二进制代码中的最大块长度。

老实说,我只想知道从哪里开始,通过编写代码来确定输入的整数二进制表示的“最大块长度”,这究竟是什么意思。

Ex:输入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 个答案:

答案 0 :(得分: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位,称为移位。在这种情况下更明确地说是逻辑右移(&gt;&gt;)。示例位模式0110变为0011.这在上面的示例中完成:

num >>= 1;

相当于:

num = num >> 1;

答案 1 :(得分: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;
}

答案 2 :(得分:0)

通过查看代码,您似乎想知道设置的位数。 这是一个猜测...

这是为了给Ratko Tomic。这家伙在位操作方面非常出色。

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

    if( value )
    {
        do
        {
            n++;
        } while( 0 != (value = value & (value - 1) ) );
    }
    return( n );
}

答案 3 :(得分: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