为 unsigned short (C) 输出位值
Outputting bit values for unsigned short (C)
我有一个函数,它接受一个无符号的 short 并显示它的位值。目前它显示除前导 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("");
}
或者您可以反复进行。对于 bases-of-two 基数,您不需要还原
(通过递归为您完成)如果您只是从另一个(最重要的)方面进行测试
滑动 1<<15
面具 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 );
}
递归函数需要知道它必须被递归调用多少次。也就是说,它需要以某种方式知道 unsigned short 类型对象的大小。
一般来说有两种方法。
第一个是二写二函数。第一个至少有一个参数,数字,第二个至少有两个参数,数字和当前位位置。
这是一个演示程序。
#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;
}
程序输出同上图
我有一个函数,它接受一个无符号的 short 并显示它的位值。目前它显示除前导 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("");
}
或者您可以反复进行。对于 bases-of-two 基数,您不需要还原
(通过递归为您完成)如果您只是从另一个(最重要的)方面进行测试
滑动 1<<15
面具 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 );
}
递归函数需要知道它必须被递归调用多少次。也就是说,它需要以某种方式知道 unsigned short 类型对象的大小。
一般来说有两种方法。
第一个是二写二函数。第一个至少有一个参数,数字,第二个至少有两个参数,数字和当前位位置。
这是一个演示程序。
#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;
}
程序输出同上图