开发者社区> 问答> 正文

c++怎么把一个十进制数转换成二进制,并计算二进制数最长连续1和0的长度

c++怎么把一个十进制数转换成二进制,并计算二进制数最长连续1和0的长度

展开
收起
知与谁同 2018-07-22 16:59:34 3155 0
1 条回答
写回答
取消 提交回答
  • 社区管理员
    很简单。如果这个十进制数的值在 C/C++ 语言本身所支持的范围内,如 char, short, int, long 之类,只需循环 N 次就能得到二进制值。这里的 N 等于数据类型的位数,如 char=8,short=16, int=32, long=32。转换的方法就是直接判断数据的每一位,示例代码(假定要转换一个值在0~4294967295之间的无符号长整型数)如下:

    #include <stdio.h>
    #include <stdlib.h>

    //参数 value 是要转换的数,len1 是要返回的连续1的最大长度,
    //len0 是要返回的连续0的最大长度

    void BinaryPrint( unsigned long value, int * len1, int * len0 )
    {
    int i, max0, max1;

    *len1 = 0;
    *len0 = 0;

    max0 = 0;
    max1 = 0;

    //由于要转换的数值,也就是参数 value 是无符号长整型,占32位,
    //所以循环32次
    for( i=0; i<32; i++ )
    {
    //0x80000000 是掩码,从最高位 bit31 算起
    if( value & (0x80000000 >> i) )
    { //遇到为1的位
    if( max0 )
    { //且之前记下的连续0长度不为0
    //保存连续0的最大长度

    if( max0 > *len0 ) *len0 = max0;
    max0 = 0;
    max1 = 1;
    }
    else
    {
    max1++;
    }

    printf( "1" );
    }
    else
    {
    if( max1 )
    { //且之前记下的连续1长度不为0
    //保存连续1的最大长度
    if( max1 > *len1 ) *len1 = max1;
    max1 = 0;
    max0 = 1;
    }
    else
    {
    max0++;
    }

    printf( "0" );
    }
    }

    printf( "\n" );
    }

    #define __DO_TEST__ 1

    #if __DO_TEST__
    int main( int argc, char ** argv )
    {
    int max0, max1;
    unsigned long val = 1234567890; //测试值,请任意修改

    printf( "value = %lu: ", val );
    BinaryPrint( val, &max1, &max0 );

    printf( "max0 = %d, max1= %d\n", max0, max1 );
    }
    #endif
    2019-07-17 22:58:14
    赞同 展开评论 打赏
问答分类:
C++
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载