scau CSAPP 第二章家庭作业

注意!这些作业以及实验都要求在32位机器上实现哦! 

2.59

编写一个C表达式,生成一个字,由x的最低有效字节和y中剩下的字节组成。

对于运算数x=0x89ABCDEF,y=0x76543210,就得到0x765432EF

Tips. 一个字长等于32位,一个字节是8位。所以最低有效字节是末8位。

(1)首先要取出x的最低有效字节,可以采用 x & 0xFF 的方法

(2)再取出y的剩下字节,可采用 y & ~0xFF 的方法,

  步骤(1)(2)这里都运用到了与1相与是本身,与0相与是0的思想。

(3)然后考虑到一个数与0相或是它本身,所以把这两部分相或就能得到结果。

2.61

写一个C表达式,在下列描述的条件下产生1,而在其他情况下得到0。假设x是int类型。

A:x的任何位都等于1
B:x的任何位都等于0
C:x的最低有效字节中的位都等于1
D:x的最高有效字节中的位都等于0
限制:不能使用(==)和(!=)

在课本第二章P39的2.1.8中,我们知道逻辑运算符(||    &&   !),他们将0视作逻辑“FALSE”(假);将所有非0值视作逻辑“TRUE”(真);计算结果总是0/1。 

 A.当x的任何位都等于1时产生1——可以先全部按位取反,这样得到任何位都应该是0,再通过逻辑非运算(!)就可以产生1

例:0x 1111 1111取反->0x 0000 0000->逻辑非运算->0x 0000 0001,此时为非零值,返回1

       0x 1111 0000取反->0x 0000 1111->逻辑非运算->0x 0000 0000,此时为0,返回0

emm,我觉得也可以这么记逻辑非——原来不是0(不管你是1,2,3……还是100000……),逻辑非后就都成了0;原来是0,逻辑非后就成了非0值(也就是1)

B.当x的任何位都等于0时产生1——直接使用逻辑非运算(!)即可

例:0x 0000 0000->逻辑非->0x 0000 0001,此时为非零值,返回1

       0x 1111 0000->逻辑非->0x 0000 0000,此时为0,返回0

C.x的最低有效字节中的位都等于1时产生1——

思路:2.59+2.61(A)

(1)获取x的最低字节:x & 0xFF

(2)套用A中的公式:!~ (x & 0xFF)

例:0x 0000 0000 & 0xFF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值