CSAPP datalab

bitXor

利用 xy=(x&y)(x&y)x\oplus y=(x\&\sim y)|(\sim x\& y)xy=(x&y)x|y=\sim(\sim x\&\sim y) 容易实现。

tmin

TMIN=0x8000 0000。

isTmax

TMAX=0x7fff ffff​。一个显著的性质是 ​2TMAX+1​ 为全 1​。同样具有这个性质的数只有 0xffff ffff​,判掉即可。

allOddBits

可以利用掩码在奇数位不变的情况下将偶数位全部置 1,然后判断是否为全 1。

negate

x=x+1-x=\sim x+1

isAsciiDigit

判断高 28 位为 3,低 4 位在 0 到 9 之间即可。

conditional

需要通过任意非 0 的数生成全 1 的掩码,通过 0 生成全 0 的掩码。一种思路是先将数规约为 0 或 1。然后左移 1,2,4,8,16次,得到全 0 或全 1。这种技巧在后面也会用到。另一种思路是,得到 0 或 1 以后加上 -1。实现条件的时候反过了就可以了。

isLessOrEqual

一种思路是:先考虑符号位不同的情况,这是容易的。当符号位相同时,我们需要找到 x 和 y 从高到低第一个不一样的位置,这就相当于是在找 xyx\oplus y 第一个为 1 的位置。这是课本的一道习题。找到以后,看一下 x 这一位是 0 还是 1 就可以了。这种办法需要的操作数比较多,可能需要一点技巧才能卡在要求范围内。

另一种简单一点的思路是:当异号时,结果与 x 的符号位一致。当同号时,根据 y-x 的符号位判断。

logicalNeg

一种思路是:将所有位都或到最后一位上,然后看最后一位是否为 1。这种做法和课本习题判断 1 的个数是奇数还是偶数十分类似。

另一种思路是:0 的特点是 0 和 “-0” 的符号位都是 0,而其它数一定有一个为 1,利用算术右移的性质即可生成 0 或 -1。加上 1 以后就得到了 1 或 0。

howManyBits

将负数翻转一下,问题归结为判断最高位的 1 是第几位,答案就是这个数 +1。这里同样需要技巧,先判断 16 位够不够,然后 8,4,2,1递减,避免了一位位地判断。


浮点数部分感觉没什么意思。就是分 规格化、非规格化数、特殊值判断一下,然后直接模拟就可以了。


图1

撒花!


CSAPP datalab
https://je3ter.github.io/2024/02/17/CSAPP/CSAPP datalab/
作者
Je3ter
发布于
2024年2月17日
许可协议