【CSAPP学习笔记】lab1:datalab

文章提出了几个基于位操作的任务,如用与非实现异或、判断32位二进制数特性等,强调在使用int类型时只能使用特定运算符,并禁止高级结构和函数调用。对于float类型,规则稍有放宽。每个问题都涉及二进制表示、补码计算以及通过位操作进行条件判断等概念。
摘要由CSDN通过智能技术生成

每一个function的格式应该符合此图,同时在使用int类型编码时只能使用特定的八个运算符与int类型,并且禁止使用高级的结构,调用其他函数。在使用float类型时规则有限度的放宽了。

1.1:用与非实现异或;

德摩根化简用与非实现异或。

1.2:输出32位二进制最小数的补码;

最小数为-2的32次方,即0x80000000;补码即取反后加一为0x80000000,为0x00000001左移31位。

2:判断x是否等于32位二进制最大数的补码;

最大数的补码为0x80000000-1,即0x7ffffffff。对每一位进行与或,即得到答案。

3:判断是否所有奇数位都是1;

将偶数位全是1,奇数位全是0的数与x按位或,如果得到的数是全1的那么即说明x奇数位全是1,可返回1。

4:求复数,取反+1,白给的。

5:判断输入的数字是否处于0x30~0x39之间,那么我们判断两端,如果既能大于a又能小于b,那么就返回1。

6:要求实现x?y:z,即为x=1时输出y,其他情况输出z,先将bool(x),让x在全0的情况下等于0x11111111,其他情况为0x00000000。然后直接按位return y或 z。

7:要求判断xy的大小,由于int是有符号整形,所以首先判断xy的符号,如果符号不同直接输出结果。只有在同号的情况下才会做减法然后判断大小。

8:不利用!的情况下实现!的功能,那么我们先取输入的相反数,然后再取或,那么除了0以外的所有数最高位都会是1,只有0是0,再移位之后与0x00000001异或即可。

9:上难度,要求返回输入数的最小字节数。那么我们先将负数转化成正数,然后再求正数最小位数加1。求正数的最小位数利用了二分查找的思想,这里是从网上抄的但感觉没什么毛病。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值