作业帮 > 综合 > 作业

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

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/22 11:57:40
c++怎么把一个十进制数转换成二进制,并计算二进制数最长连续1和0的长度
很简单.如果这个十进制数的值在 C/C++ 语言本身所支持的范围内,如 char,short,int,long 之类,只需循环 N 次就能得到二进制值.这里的 N 等于数据类型的位数,如 char=8,short=16,int=32,long=32.转换的方法就是直接判断数据的每一位,示例代码(假定要转换一个值在0~4294967295之间的无符号长整型数)如下:
#include
#include
//参数 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> 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
再问: 没看懂,“ * ”这个符号没用过,不知道代表啥意思…… if( value & (0x80000000 >> i))这个十六进制的条件也没看懂…… 还有我做的那道题只要求int就够了,不用unsigned long,是直接替换就可以了吗?
再答: 星号"*" 有多种含义,而且这是最基本的 C/C++ 知识,所有的 C/C++ 语言教材上都会讲到,应该能看懂才对,没看懂说明尚未入门。不过你既然问及,这里就说上几句: 1) 函数 void BinaryPrint( unsigned long value, int * len1, int * len0 ) 定义中,参数 int * len1 及 int * len0 表示传入的是整型指针,这里星号"*" 是"指针"(或称”地址“) 的含义;函数体中的代码 *len1 = 0; 则表示给参数(整型指针 len1 )"赋值" 为0; 代码 if( max0 > *len0 ) 的 *len0 则表示对整型指针 len0 “取其地址中所保存的值”(或者简称“取值”);主函数 int main( int argc, char ** argv ) 中的 char ** argv 则表示参数 argv 是一个指向“字符指针”(其实理解成“字符串”更好)的“指针”,也可以写成 char * argv[ ] 是等效的,所以你可以将 char ** argv 理解成是一个 “字符串数组”。 2)代码 if( value & (0x80000000 >> i))的意思就是“如果第 i 位为1”。 3)可以直接参数 value 改成 int 类型。若是改为其它(如 char, short) 类型,相应的循环位置还要改成对应位数(一般char为8位,short为16位, int位数在有的老旧平台如 DOS 上的 TurboC 上是16位,现在一般都是32位)。 总之,建议先去仔细读书。