《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位是尾数。你可以根据尾数和指数来判断要用多少二进制位才能精确表示这个浮点数。代码不怎么好写,这种题目应该也不常考吧。
代码:
题目:给定一个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; }
相关文章推荐
- 《Cracking the Coding Interview》——第5章:位操作——题目1
- 《Cracking the Coding Interview》——第5章:位操作——题目3
- 《Cracking the Coding Interview》——第5章:位操作——题目4
- 《Cracking the Coding Interview》——第5章:位操作——题目5
- 《Cracking the Coding Interview》——第5章:位操作——题目6
- 《Cracking the Coding Interview》——第5章:位操作——题目7
- 《Cracking the Coding Interview》——第5章:位操作——题目8
- 《Cracking the Coding Interview》——第13章:C和C++——题目8
- 《Cracking the Coding Interview》——第14章:Java——题目4
- 《Cracking the Coding Interview》——第17章:普通题——题目6
- 《Cracking the Coding Interview》——第18章:难题——题目1
- 《Cracking the Coding Interview》——第2章:链表——题目5
- 《Cracking the Coding Interview》——第4章:树和图——题目7
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目1
- 《Cracking the Coding Interview》——第11章:排序和搜索——题目2
- 《Cracking the Coding Interview》——第10章:可扩展性和存储空间限制——题目7
- 《Cracking the Coding Interview》——第14章:Java——题目5
- 《Cracking the Coding Interview》——第18章:难题——题目2
- 《Cracking the Coding Interview》——第2章:链表——题目6
- 《Cracking the Coding Interview》——第4章:树和图——题目8