问题描述
我有一个函数,它带有一个无符号的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次迭代,而不仅仅是直到没有有效数字为止。 使用您的方法,您可以添加一个depth参数:
#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("");
}
或者您可以迭代地进行。对于两个基数的基数,不需要还原
(通过递归为您完成),如果您只是简单地从另一(最重要)方面进行测试
滑动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类型的对象的大小。
通常有两种方法。
第一个是两个编写两个函数。第一个具有至少一个参数,即数字,第二个具有至少两个参数,即数字和当前位位置。
这是一个演示程序。
HTTPError Traceback (most recent call last)
<ipython-input-5-b158a1e893a0> in <module>
----> 1 html = urlopen("https://dblp.org/db").read()
2 #print(html)
3 soup = BeautifulSoup(html)
4 soup.prettify()
~\Anaconda3\lib\urllib\request.py in urlopen(url,data,timeout,cafile,capath,cadefault,context)
220 else:
221 opener = _opener
--> 222 return opener.open(url,timeout)
223
224 def install_opener(opener):
~\Anaconda3\lib\urllib\request.py in open(self,fullurl,timeout)
529 for processor in self.process_response.get(protocol,[]):
530 meth = getattr(processor,meth_name)
--> 531 response = meth(req,response)
532
533 return response
~\Anaconda3\lib\urllib\request.py in http_response(self,request,response)
639 if not (200 <= code < 300):
640 response = self.parent.error(
--> 641 'http',response,code,msg,hdrs)
642
643 return response
~\Anaconda3\lib\urllib\request.py in error(self,proto,*args)
567 if http_err:
568 args = (dict,'default','http_error_default') + orig_args
--> 569 return self._call_chain(*args)
570
571 # XXX probably also want an abstract factory that knows when it makes
~\Anaconda3\lib\urllib\request.py in _call_chain(self,chain,kind,meth_name,*args)
501 for handler in handlers:
502 func = getattr(handler,meth_name)
--> 503 result = func(*args)
504 if result is not None:
505 return result
~\Anaconda3\lib\urllib\request.py in http_error_default(self,req,fp,hdrs)
647 class HTTPDefaultErrorHandler(BaseHandler):
648 def http_error_default(self,hdrs):
--> 649 raise HTTPError(req.full_url,hdrs,fp)
650
651 class HTTPRedirectHandler(BaseHandler):
HTTPError: HTTP Error 406: Not Acceptable
程序输出为
#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
程序输出与上面显示的相同。