博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自己写平方根squareroot函数
阅读量:6709 次
发布时间:2019-06-25

本文共 1028 字,大约阅读时间需要 3 分钟。

今日做一面试题目,写一平方根squareroot函数,函数接口为:

unsigned int squareroot(unsigned int input);    //不考虑float情况

 

经过思考,用位移的方法,一个整数32bits,那么平方根最多16bits,那么对于这16个bits,从最大权重的bit开始,看是置1还是置0,一步一步往后走,到最后一个bit被置完之后,平方根也就求出了。

那么如何判断后16bits中,某一个特定的bit是0还是1呢?

这样判断,因为从most significant到least significant,那么首先将当前需要判断的bit置1,然后平方,看比input是否大,如果置1了都不比input大,那么说明还需要右面的(less significant)bits们帮忙来接近平方根。简单说一句,先将该位置1,平方,如果小于等于input,那么该位就需要置1;否则,置0。

 

那么接下来,就是见证代码的时刻:

#include 
using namespace std; typedef unsigned int uint; uint squareroot(uint input);int main(){ uint input; cout<<"Plz input a int to be squarerooted:"<
>input; uint answer = squareroot(input); cout<<"The answer is:"<
<

 

 

 

中途曾经出过一个问题,问题发生于squareroot()函数中的第7行:

if ( ((answer + (1<<i)) * (answer + (1<<i))) <= input )

一开始对于其中的 (1<<i)部分没有加括号,结果导致结果不对,后来经过仔细排查,发现是运算符优先级的问题,如果不加括号,那么该行为:

if ( ((answer + 1<<i) * (answer + 1<<i)) <= input )

问题是:answer + 1<<i 变成了 (answer + 1)<<i,这肯定不是我们想要的结果。我们想让 1<<i 先结合。

解决方法是:answer + (1<<i),把括号加上了就ok了。

 

转载地址:http://laxlo.baihongyu.com/

你可能感兴趣的文章
Maganto错误-Cannot initialize the indexer process的解决方法
查看>>
OpenCV 学习资源整理
查看>>
Apache http强制转为https页面访问(转)
查看>>
C++数据结构之二叉树
查看>>
dbcp、c3p0、jdbc常用连接配置
查看>>
publish_subscribe
查看>>
C语言初学者代码中的常见错误与瑕疵(4)
查看>>
php 递归读取目录
查看>>
C++操作xls
查看>>
开源存储
查看>>
【cs229-Lecture2】Gradient Descent 最小二乘回归问题解析表达式推导过程及实现源码(无需迭代)...
查看>>
php中的 file_get_contents(‘php://input’)
查看>>
C/C++中各种类型int、long、double、char表示范围(最大最小值)
查看>>
linux权限---【600,644,700,755,711,666,777】 - - 博客频道 - CSDN.NET
查看>>
SSAS系列——【04】多维数据(物理体系结构)
查看>>
Android Handler传递参数动态更新UI界面demo
查看>>
[转]在SqlServer 中解析JSON数据
查看>>
微信“摇一摇·周边”正式开放
查看>>
"Asp.Net Web Api MediaTypeFormatter Error for x-www-formurlencoded data" 解决方法
查看>>
UML类图简单学习 各种对象、关系UML表示法
查看>>