为 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;
}

程序输出同上图