《Cracking the Coding Interview》——第5章:位操作——题目2
发布日期:2021-10-25 13:14:40 浏览次数:1 分类:技术文章

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

2014-03-19 05:47

题目:给定一个double型浮点数,输出其二进制表示,如果不能在32个字符内完成输出,则输出“ERROR”。

解法:如果你熟悉IEEE754标准,应该知道double和float型的二进制位里都是什么。double型最高位是符号位,随后11位是指数位,之后52位是尾数。你可以根据尾数和指数来判断要用多少二进制位才能精确表示这个浮点数。代码不怎么好写,这种题目应该也不常考吧。

代码:

1 // 5.2 Given a double, print its binary representation if can be done in 32 characters. 2 #include 
3 using namespace std; 4 5 void printBinary(unsigned long long num) 6 { 7 unsigned long long bit = 1ull << 63; 8 do { 9 putchar('0' + !!(num & bit));10 if ((bit == 1ull << 63) || (bit == 1ull << 52)) {11 putchar(' ');12 }13 bit >>= 1;14 } while (bit);15 }16 17 union un {18 unsigned long long ull;19 double d;20 };21 22 int main()23 {24 double d;25 int exp;26 int ll, rr;27 int i;28 unsigned long long sig;29 un u;30 31 while (scanf("%lf", &d) == 1) {32 u.d = d;33 printBinary(u.ull);34 putchar('\n');35 // 1.5 is represented as 1 + 1 * 2^-1, so the '1' must be added to the significant.36 sig = (u.ull - (u.ull >> 52 << 52)) | (1ull << 52);37 // exponent has an offset of 12738 exp = 1022 - (int)(u.ull >> 52 & ~(1ull << 11));39 40 ll = 52;41 rr = 0;42 while ((sig & (1ull << rr)) == 0) {43 ++rr;44 }45 46 if (ll - rr + 1 + exp <= 30) {47 // '0.' will take 2 characters, so 30 characters available48 printf("0.");49 for (i = 0; i < exp; ++i) {50 putchar('0');51 }52 for (i = ll;i >= rr; --i) {53 putchar('0' + !!(sig & (1ull << i)));54 }55 putchar('\n');56 } else {57 printf("ERROR\n");58 }59 }60 61 return 0;62 }

 

转载于:https://www.cnblogs.com/zhuli19901106/p/3610484.html

转载地址:https://blog.csdn.net/weixin_30909575/article/details/99075791 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Akka(37): Http:客户端操作模式
下一篇:Android 自定义View (二) 进阶

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月01日 07时19分17秒