注意!这些作业以及实验都要求在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