CSAPP
文档状态:编辑....
Download
Manual
- Error[fatal error: sys/cdefs.h]
[RESOLVED]: sudo apt-get install libc6-dev-i386
Datalab
常使用的规则
可以用来判断一串二进制数字中是否存在1
fitsBit[rating:2]
- !为字节级操作
- 本题转换为能否以更少的位数表示x,从而进一步转换为符号位扩展问题
- ~n = -n-1[不让使用减号,只能利用位级操作表达字节级操作]
- => -n = ~n+1[注意补码不对称,-128使用此规则得不到128]
divpwr2
- x<0: x/(2^n) = (x + (1 << n) - 1) >> n[记住]
- x>0: x>>2
- 对补码来说 x>>31,x>0得到全0,x<0时得到全F,正好可以利用&做掩码
- int val = ((1<<n)+~0);(√)
- int val = (1<<n+~0);(×)
isPositive
- [0]>>31 = 0 ![0] =1
- [>0]>>31 = 0 ![>0]=0
- [<0]>>31 = 1 ![<0]=1
以上第一列不可分开,但是加上第二列就可以分开了,直接使用|
isLessOrEqual
- 单纯求符号位[0000 0001]或[0000 0000]使用(x>>31)&1
- 否则对负数x进行x>>31得[1111 1111]
- 不能直接用减法,会出现溢出
isLessOrEqual(-2147483648[0x80000000],2147483647[0x7fffffff]) failed
- 同号[(x>>31)^(y>>31)]==0 使用减法(y+(~x)+1)>>31==0[true] ==1(false)
- 异号[(x>>31)^(y>>31)]==1 比较符号!((y>>31)-(x>>31))==1[true] ==0(false)
- 如何在[(x>>31)^(y>>31)]==0时使用上面的操作,反之使用下面的操作