您的位置:首页 > 其它

《Cracking the Coding Interview》——第5章:位操作——题目2

2014-03-19 05:56 405 查看
2014-03-19 05:47

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

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

代码:

// 5.2 Given a double, print its binary representation if can be done in 32 characters.
#include <cstdio>
using namespace std;

void printBinary(unsigned long long num)
{
unsigned long long bit = 1ull << 63;
do {
putchar('0' + !!(num & bit));
if ((bit == 1ull << 63) || (bit == 1ull << 52)) {
putchar(' ');
}
bit >>= 1;
} while (bit);
}

union un {
unsigned long long ull;
double d;
};

int main()
{
double d;
int exp;
int ll, rr;
int i;
unsigned long long sig;
un u;

while (scanf("%lf", &d) == 1) {
u.d = d;
printBinary(u.ull);
putchar('\n');
// 1.5 is represented as 1 + 1 * 2^-1, so the '1' must be added to the significant.
sig = (u.ull - (u.ull >> 52 << 52)) | (1ull << 52);
// exponent has an offset of 127
exp = 1022 - (int)(u.ull >> 52 & ~(1ull << 11));

ll = 52;
rr = 0;
while ((sig & (1ull << rr)) == 0) {
++rr;
}

if (ll - rr + 1 + exp <= 30) {
// '0.' will take 2 characters, so 30 characters available
printf("0.");
for (i = 0; i < exp; ++i) {
putchar('0');
}
for (i = ll;i >= rr; --i) {
putchar('0' + !!(sig & (1ull << i)));
}
putchar('\n');
} else {
printf("ERROR\n");
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐