错位数字的位

时间:2018-08-22 20:11:17

标签: c bit

我创建了一个程序,该程序应该接收一个整数并返回该数字的二进制表示形式。现在,我想添加一个函数来计算数字中有多少个“ 1”,这就是我遇到麻烦的地方,例如:

输入:123 -> 0b01111011-> 4(因为“ 1”附近有4个)

要做到这一点,我需要将当前脚本的输出存储在变量中,但是由于我使用的是putchar,所以我不能超出这个范围:

#include <stdio.h>

void displayBits(unsigned int value); // prototype

int main(void)
{ 
   unsigned int x; // variable to hold user input
   printf("%s", "Enter a nonnegative int: ");
   scanf("%u", &x);
   displayBits(x);
} 
// display bits of an unsigned int value
void displayBits(unsigned int value)
{  



   // define displayMask and left shift 31 bits
   unsigned int displayMask = 1 << 7; 
   printf("%10u = ", value);
   printf("0b");


   // loop through bits 
   for (unsigned int c = 1; c <= 8; ++c) {

      putchar(value & displayMask ? '1' : '0');
      value <<= 1;


   } 
   putchar('\n');
} 

1 个答案:

答案 0 :(得分:0)

如果您要计算设置为1的最大相邻位数,则可以按照以下步骤进行操作。

具有一个计数器,该计数器跟踪找到的行中“ 1”位的大小。当找到“ 1”增量时,将其设为“ 0”时将其设置为0。还需要一个变量来跟踪最长的运行时间。如果当前电流大于最长电流,则将最长电流设置为当前电流。

int current_run = 0, longest_run = 0;
while (displayMask) {
   if (value & displayMask) {
       current_run++;
       if (current_run > longest_run) {
           longest_run = current_run;
       }
       putchar('1');
   } else {
       current_run = 0;
       putchar('0');
   }

   displayMask >>= 1;
}