第 2 章 信息的表示和处理
2.65
每一次操作,将
w
位的整数
x
从中间分成两个
2w
位的整数
y
和
z,接着令
x = y ˆ z。操作
5 次后即得到答案。
我们将这样的思路称为“折半递归法”。
2.66
每一次操作,令
x = x | (x >> y),其中
y=1,2,4,⋯。操作
5 次后即实现了提示的转换。
2.75
x,y
是补码数,x′=T2Uw(x),y′=T2Uw(y)。
x′⋅y′=(x+xw−1⋅2w)×(y+yw−1⋅2w)=x⋅y+(xw−1⋅y+yw−1⋅x)2w+xw−1⋅yw−1⋅22w
进一步,令
a = signed_high_prod(x, y), b = unsigned_high_prod(x’, y’),有
b⋅2w+x′∗wuy′=a⋅2w+T2Uw(x∗wty)+(xw−1⋅y+yw−1⋅x)2w+xw−1⋅yw−1⋅22w
化简得
b=a+xw−1⋅y+yw−1⋅x+xw−1⋅yw−1⋅2w
即
b=(a+xw−1⋅y+yw−1⋅x)mod2w=T2Uw(a)+tuxw−1⋅y′+tuyw−1⋅x′
2.80
threefourths(x)={3⋅⌊x/4⌋+xmod3−[xmod3=0],3⋅⌊x/4⌋+xmod3,x≥0x<0
2.97
不失一般性地,令
i
为正数。i
的有效位数不超过 24 位的时候可以不舍入地直接转换成
float。当有效位数超过
24 位时,一般而言,取最高位往后第 23
位作为舍入时的最低有效位,但是当最高位及其后 23 位均为
1,并且向上舍入后,有效位数由于进位而超过预期的 24
位,此时最低有效位应取高一位。
代码参见 https://git.gzezfisher.top/FISHER_/CSAPP-sol/src/branch/main/homework/chapter2。