那些能手写各种排序的人能手写数的补码吗?比如 -1.234 的补码。
就你举的这个例子,除了那些要考试,要面试的,或者打竞赛的人,没有人天天去刷什么排序的哪一步是怎么样的。但是你一说排序,我们就知道排序是什么东西,大概有哪些排序,他们的原理大概是怎么样的,他们的时间复杂度是怎么样的,在某个场景时,我们也能去分析用什么算法,而不是马上打开 IDE 就开始写代码,这种情况在工程中几乎不可能存在,要写我们也会网上查,去笔记中找。
什么补码就更是如此,我们学这个不是让你拿个数字就能开始算,而是知道,补码是个什么东西?它用在什么地方,为什么要有这个东西?它大概是个什么思路?诸如此类。
想了解的话可以看一下这个算法: https://www.ampl.com/netlib/fp/dtoa.c 苹果的 iOS macOS 用的就是这份代码。
具体到 1.234 这个数,如果用手算的话,就是 1234 / 1000,转换为二进制,再进行大整数计算,得到的是一个无限长度的二进制小数:
1.001110111110011101101100100010110100001110010101100000010000011000100100110111010010111100011010100111111011111001110110…
这里 54 bit 是 0,则向下舍入,得到二进制:
1.0011101111100111011011001000101101000011100101011
转换为 IEEE 754 表示,最高位 1 表示负数,后面 11 位是 exp 0,加上 1023 bias 就是 01111111111,
最后 52 位就是上面的二进制,隐藏高位 1,合起来就是:
1 01111111111 0011101111100111011011001000101101000011100101011000
用 hex 表示就是
0xbff3be76c8b43958
我们可以再实际验证一下:
uint64_t p = 0xbff3be76c8b43958ull;
double d = *(double *)&p;
printf(“%.17gn”, d);
不抬杠的话, 排序其实是非常好的问题, 考察重点也不只是基础编程能力, 而是优化代码的能力, 一个好的面试官会不会让你写各种排序, 而是让你选择一种你排序来写并且说明为什么选这个, 写完了再引导你进行优化, 随便还能看看你的代码质量. 很多人之所以反感排序是因为很多面试官的水平不够, 并不是写个排序本身有什么问题.
我之前记不住是因为没有接触到这个公式和体系,看的都是知乎的什么解释,现在发现看的知乎那个解释适合理解,但不适合计算。
“`
0000 0000
-0000 0101
————–
1111 1011
“`