首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算二进制数的最大C块长度

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

Stack Overflow用户
提问于 2012-09-12 10:41:59
回答 3查看 1.6K关注 0票数 0

我想重申的事实是,我并不是要求直接针对我的问题编写代码,而是想要关于如何实现该解决方案的信息。

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

老实说,我只是想知道从哪里开始,通过编写代码来计算输入的整数二进制表示的“最大块长度”,以及问题的确切含义。

例如:输入456输出: 111001000 1的数量:4最大块长度:?

这是我到目前为止的代码,如果你想知道我是从哪里来的,可以参考。

代码语言:javascript
复制
#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
EN

回答 3

Stack Overflow用户

发布于 2012-09-12 11:06:12

假设你正在寻找1的最长运行时间。

这是如何在32位上做到这一点的。你应该能够将这个想法扩展到任意长度的比特流。

代码语言:javascript
复制
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,则递增计数。否则,它将结束一次运行,在这种情况下,检查前一次运行是否比前一次最大运行时间长,并重置计数。

测试bit的方法是使用掩码。在上面的示例中,测试的最低阶位

代码语言:javascript
复制
num & 1

要测试数字中的下一位,需要将所有位向右移动1位,这称为移位。更明确地说,在这种情况下,逻辑右移(>>)。示例位模式0110变为0011。这是在上面的示例中完成的:

代码语言:javascript
复制
num >>= 1;

相当于:

代码语言:javascript
复制
num = num >> 1;
票数 3
EN

Stack Overflow用户

发布于 2012-09-12 11:33:48

试试这个:

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2012-09-12 11:05:06

这应该可以在python中解决这个问题,使用字符串操作...

这样做的主要目的是帮助其他人理解你想要实现的目标。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12380554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档