作业2

2.61

A. !(~x)

B. !x

C. !(~(x|0xffffff00))

D. !(~(x|0x00ffffff))

2.63

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*逻辑右移与算术右移只有当最高位为1时不同*/

unsigned srl(unsigned x,int k){
/* Perform shift arithmetically */
unsigned xsra=(int)x>>k;

/* 得到位数 */
int w=sizeof(int)<<3;
/*如果最高位是1,就把前 k 位与1进行异或操作*/
if(x&0x80000000)
xsra^=(-1)<<(w-k); //利用(-1)<<(w-k) 得到前 k 位均为1的数

return xsra;
}

int sra(int x,int k){
/* Perform shift logically */
int xshl=(unsigned)x>>k;

/* 得到位数 */
int w=sizeof(int)<<3;
/*如果最高位是1,就把前(w-k)位与1进行或操作*/
if(x&0x80000000)
xshl|=(-1)<<(w-k);

return xshl;
}

2.65

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* Return 1 when x contains an odd number of 1s; 0 otherwise.
Assune w=32 */

/***************************************************************
* 在所有的1中去掉偶数个1对结果不会产生影响,所以将32位依次折半前半部分与后 *
* 半部分进行异或可以去除偶数个1,循环进行直到最后一位,如果最后一位是1则是 *
* 奇数,为0则是偶数。 *
***************************************************************/

int odd_ones(unsigned x)
{
unsigned y;
unsigned w = 16;
for(;w >= 1; w >>= 1)
{
y = x >> w;
x ^= y;
}
return x & 1;
}

2.71

A. packed_t是无符号数,而它包装的4个字节都是有符号数,1byte的包装在无符号数中的有符号数扩展后符号位并没有扩展。

B.

1
2
3
4
5
6
7
int xbyte(packed_t word, int byteum)
{
int size = sizeof(unsigned);
int left = (size - 1 - bytenum) << 3;
int right = (size - 1) << 3;
return (int) word << left >> right;
}

2.72

A. sizeof 的返回值 size_t 是无符号类型,在做减法 maxbytes-sizeof(val) 时得到的结果被提升为无符号型,总是大于0.

B.

1
2
3
4
void copy_int(int val, void* buf, int maxbytes) {
if(maxbytes >= (int)sizeof(val))
memcpy(buf, (void*)&val, sizeof(val));
}

2.77

A. (x << 4) + x

B. -(x << 3 - x)

C. (x << 6) - (x << 2)

D. (x << 4) - (x << 7)

2.87

描述HexMEVD
-080000-14-0-0.0
最小的 $>2$ 的值4001$\frac{1025}{1024}$1$\frac{1025}{512}$2.00195312
512600019512512.0
最大的非规格化数03FF$\frac{1023}{1024}$-14$\frac{1023}{2^{24}}$6.09755516e-5
$-\infty$FC00$-\infty$$-\infty$
十六进制表示为3BB0的数3BB0$\frac{123}{64}$-1$\frac{123}{128}$0.9609375

2.90

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <assert.h>
#include <math.h>

float u2f(unsigned x) {
return *(float*) &x;
}

float fpwr2(int x) {
/* Result exponent and fraction */
unsigned exp, frac;
unsigned u;

if (x < 2-pow(2,7)-23) {
/* Too small. Return 0.0 */
exp = 0;
frac = 0;
} else if (x < 2-pow(2,7)) {
/* Denormalized result */
/* 非规格化表示,阶码编码全为0,E=1-Bias(Bias = 2 ^ (k - 1) - 1);
* 最小值0.000(23个0)001 * 2 ^ E = 2 ^ (2 - 2 ^ 7); */
exp = 0;
frac = 1 << (unsigned)(x - (2-pow(2,7)-23));
} else if (x < pow(2,7)-1+1) {
/* Normalized result */
/* 规格化表示,最小值1.00...00 * 2 ^ (1 - (2 ^ 7 - 1)) = 2 ^ (2 - 2 ^ 7)
最大值1.00...00 * 2 ^ ((2^8-1) - (2^7-1)) = 2 ^ 2 ^ 7*/
exp = pow(2,7)-1+x;
frac = 0;
} else {
/* Too big, Return +oo */
exp = 0xFF;
frac = 0;
}

/* Pack exp and frac into 32 bits */
u = exp << 23 | frac;
/* Return as float */
return u2f(u);
}