csapp datalab 实验报告:位运算实现各种操作

本文通过位运算实现各种操作,如异或、取最小值、取最大值、奇数位判断、取负、ASCII字符判断等。利用摩根定理、补码和位移等知识,巧妙地运用位运算完成各种逻辑。例如,isAsciiDigit通过位运算判断字符是否为ASCII数字,negate通过取反加1实现取负操作。

1.bitXor:要求限用运算符实现异或,实际上我们知道逻辑异或可以只用与或非三类运算组合实现,因此很容易得到a^b=((a&b)|(a&b)),但是题目没让我们使用或运算符,根据摩根定理我们可以得到:(a&b)=a|b,带入即可得到答案。

2.tmin:返回int的最小值,int属于有符号数,负数存储以补码形式,因此我们很容易得到-2147483648的补码就是0x80000000,拆成二进制就是1后面31个0,我们通过对1移位运算得到是1<<31

3.Tmax:判断x是否为int的最大值,判断一个数是否为一个数的运算我们很容易想到异或,异或值为0当且仅当两个数相等时得到。最大值可以通过移位取反(1<<31)得到0x7fffffff,那么判断就容易多了。!(x^((1<<31))

  1. allOddBits:判断二进制奇数位上是否全为1,我们可以先把偶数位的所有数置0,奇数位不变,置0,不变,很容易想得到&运算,那么在把偶数位全部置0之后结果肯定=0xAAAAAAAA的,不等则返回0,那还是异或运算。!((x&0xAAAAAAAA)^0xAAAAAAAA)

  2. negate:取负运算很简单,~x+1

  3. isAsciiDigit:判断x是否在0x30~0x39之间,并且这里允许用+运算符,众所周知,有+就可以实现减法运算,我们只要把x-0x30之后看看它是否为正且x-0x3A是否为负就可以判断x在不在所在区间了,取负运算在上面已经有了,那么得到两个值怎么判断它的符号,那么就把1<<31对它进行&运算就可以得到0x800000000或者是0,一正一负异或得到1,若不在区间内则异或得到0,反正我觉得应该是不会有x-0x39为负,x-0x30为正的情况把,我是没有想到qwq,如果有,那就用&就不需要用异或了
    return (!((x+(0x30+1))&(1<<31))&!!((x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xi@0ji233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值