输出无符号短字符(C)的位值



我有一个函数,它接受一个无符号的short并显示它的位值。目前,它显示除前导0之外的所有0,我想显示所有16位的位置。

void display_result(unsigned short result)
{
if(result >> 1)
{
display_result(result >> 1);
}
if(result & 1)
{
putc('1', stdout);
}
else
{
putc('0', stdout);
}
return;
}

示例输入:3
期望输出:0000000000000011
实际输出:11

我对代码的理解是,它本质上是以遍历数组的方式遍历结果的位值,基于if语句输出,但实际上并不是这样,这告诉我缺少了一些东西。有人能解释一下吗?(注意:我在发布之前已经搜索过这些信息,但我的搜索功能可能不足(。

您需要完整的16次迭代,而不仅仅是直到没有有效数字。使用您的方法,您可以添加一个深度参数:

#include <stdio.h>
#include <limits.h>
static void display_result_n_(unsigned short result, int n)
{
if(--n) { display_result_n_(result>>1,n); }
if(result & 1) { putc('1', stdout); }
else { putc('0', stdout); }
return;
}
void display_result(unsigned short result)
{
display_result_n_(result,sizeof(unsigned short)*CHAR_BIT);
}
int main()
{
display_result(3);
puts("");
}

或者你可以反复做。对于两个基数,不需要可逆(通过递归为您完成(如果您只是通过滑动CCD_ 1掩模16次。

void display_result(unsigned short result)
{
unsigned mask = 1U<<((sizeof(unsigned short))*CHAR_BIT-1);
for(;mask;mask>>=1) putc('0'+ !!(result&mask),stdout );
}

递归函数需要知道它必须被递归调用多少次。也就是说,它需要以某种方式知道无符号短字符类型的对象的大小。

通常有两种方法。

第一个是两个写两个函数。第一个将具有至少一个参数,数字,而第二个则具有至少两个参数,数量和当前比特位置。

这是一个示范节目。

#include <stdio.h>
#include <limits.h>
FILE * display_result( unsigned short n, size_t size, FILE *fp )
{
if ( size != 0 )
{
display_result( n >> 1, size - 1, fp );
fputc( ( n & 1 ) + '0', fp );
}

return fp;
}
FILE * bit_image( unsigned short n, FILE *fp )
{
display_result( n, sizeof( unsigned short ) * CHAR_BIT, fp );

return fp;
}
int main(void) 
{
for ( unsigned short i = 0; i < 16; i++ )
{
fputc( 'n', bit_image( i, stdout ) );
}

return 0;
}

程序输出为

0000000000000000
0000000000000001
0000000000000010
0000000000000011
0000000000000100
0000000000000101
0000000000000110
0000000000000111
0000000000001000
0000000000001001
0000000000001010
0000000000001011
0000000000001100
0000000000001101
0000000000001110
0000000000001111

第二种方法是使用一个静态局部变量来计算递归调用。

例如

#include <stdio.h>
#include <limits.h>
FILE * display_result( unsigned short n, FILE *fp )
{
static size_t size;

if ( size != CHAR_BIT * sizeof( unsigned short ) )
{
++size;
display_result( n >> 1, fp );
fputc( ( n & 1 ) + '0', fp );
--size;
}

return fp;
}
int main(void) 
{
for ( unsigned short i = 0; i < 16; i++ )
{
fputc( 'n', display_result( i, stdout ) );
}

return 0;
}

程序输出与上面显示的相同。

最新更新