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 <cstdio> 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 127 38 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 available 48 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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)