今日阅读范围:P28 ~ P60
Chapter 2 : 信息的表示和处理 - 习题 (1)
2.1
A.
$$
\text {0x39A7F8} = \text {(0011 1001 1010 0111 1111 1000)}_2
$$
B.
$$
\text {(1100 1001 0111 1011)}_2 = \text {0xC97B}
$$
C.
$$
\text {0xD5E4C} = \text {(1101 0101 1110 0100 1100)}_2
$$
D.
$$
\text {(0010 0110 1110 0111 1011 0101)}_2 = \text {0x26E7B5}
$$
2.2
$n$ | $2^n$ (dec) | $2^n$ (hex) |
---|---|---|
9 | 512 | 0x200 |
19 | 524288 | 0x80000 |
14 | 16384 | 0x4000 |
16 | 65536 | 0x10000 |
17 | 131072 | 0x20000 |
5 | 32 | 0x20 |
7 | 128 | 0x80 |
2.3
dec | bin | hex |
---|---|---|
0 | 0000 0000 | 0x00 |
167 | 1010 0111 | 0xa7 |
62 | 0011 1110 | 0x3e |
188 | 1011 1100 | 0xbc |
55 | 0011 0111 | 0x37 |
136 | 1000 1000 | 0x88 |
243 | 1111 0011 | 0xf3 |
82 | 0101 0010 | 0x52 |
172 | 1010 1100 | 0xac |
231 | 1110 0111 | 0xe7 |
2.4
A.
$$
\text {0x503c + 0x8 = 0x5044}
$$
B.
$$
\text {0x503c - 0x40 = 0x4ffc}
$$
C.
$$
\text {0x503c + 64 = 0x503c + 0x40 = 0x507c}
$$
D.
$$
\text {0x50ea - 0x503c = 0xae}
$$
2.5
int val = 0x87654321
byte_pointer valp = (byte_pointer) &val;
show_bytes(valp, 1); /* A. */
show_bytes(valp, 2); /* B. */
show_bytes(valp, 3); /* C. */
A.
- 小端法:21
- 大端法:87
B.
- 小端法:21 43
- 大端法:87 65
C.
- 小端法:21 43 65
- 大端法:87 65 43
2.6
A.
$$
\text {0x00359141 = (1101011001000101000001)}_2
$$
$$
\text {0x4A564504 = (1001010010101100100010100000100)}_2
$$
B.
$$
\begin{aligned}
\text {0x00359141} = (1101011001000101000001&)_2 \\
\text {0x4A564504} = (10010100101011001000101000001&00)_2
\end{aligned}
$$
前者的最低位到倒数第二高位,后者第三位开始。21位匹配。
C.
后一串的最后两位和前八位。前一串的最高位。
2.7
0x61 0x62 0x63 0x64 0x65 0x66
2.8
运算 | 结果 |
---|---|
a | [01101001] |
b | [01010101] |
~a | [10010110] |
~b | [10101010] |
a & b | [01000001] |
a | b | [01111101] |
a ^ b | [00111100] |
2.9
A.
- 黑 <=> 白
- 蓝 <=> 黄
- 绿 <=> 红紫
- 蓝绿 <=> 红
B.
- 蓝色 | 绿色 = 蓝绿
- 黄色 & 蓝绿 = 绿色
- 红色 ^ 红紫 = 蓝色
2.10
Step | *x |
*y |
---|---|---|
initial | a | b |
1 | a | a ^ b |
2 | a ^ b ^ a = b | a ^ b |
3 | b | b ^ a ^ b = a |
2.11
A. 都是 $k + 1$
B. 因为 inplace_swap()
传入了两个相同的地址,这两个相同的地址也必然指向相同的指,后来一进行异或运算就会变成零。
C. first <= last
=> first < last
2.12
A.
x & 0xFF
B.
(((~(x >> 2)) + 1) << 1) + x & 0xFF
正确应为:x ^ ~0xFF
C.
x | 0xFF
2.13
bool_or
int result = bis(x, y);
bool_xor
int result = bis(bic(y, x), bic(x, y));
2.14
x = 0x66
y = 0x39
x & y = 0x20
x && y = 0x01
x | y = 0x7f
x || y = 0x01
~x | ~y = 0xdf
!x || !y = 0x00
x & !y = 0x00
x && ~y = 0x01
2.15
!(x & y)
错误:应为 !(x ^ y)
2.16
x (hex) | x (bin) | x << 3 (bin) | x << 3 (hex) | x >> 2 (logic, bin) | x >> 2 (logic, hex) | x >> 2 (arithmetic, bin) | x >> 2 (arithmetic, hex) |
---|---|---|---|---|---|---|---|
0xc3 | 1100 0011 | 0001 1000 | 0x18 | 0011 0000 | 0x30 | 1111 0000 | 0xf0 |
0x75 | 0111 0101 | 1010 1000 | 0xa8 | 0001 1101 | 0x1d | 0001 1101 | 0x1d |
0x87 | 1000 0111 | 0011 1000 | 0x38 | 0010 0001 | 0x21 | 1110 0001 | 0xe1 |
0x66 | 0110 0110 | 0011 0000 | 0x30 | 0001 1001 | 0x19 | 0001 1001 | 0x19 |
2.17
hex | bin | $B2U_4(\vec x)$ | $B2T_4(\vec x)$ |
---|---|---|---|
0xE | [1110] | 14 | -2 |
0x0 | [0000] | 0 | 0 |
0x5 | [0101] | 5 | 5 |
0x8 | [1000] | 8 | -8 |
0xD | [1101] | 13 | -3 |
0xF | [1111] | 15 | -1 |
2.18
- A. 0x2e0 = 736
- B. -0x58 = -88
- C. 0x28 = 40
- D. -0x30 = -48
- E. 0x78 = 120
- F. 0x88 = 136
- G. 0x1f8 = 504
- H. 0xc0 = 192
- I. -0x48 = -72
2.19
$x$ | $T2U_4(x)$ |
---|---|
-8 | -8 + 16 = 8 |
-3 | -3 + 16 = 13 |
-2 | -2 + 16 = 14 |
-1 | -1 + 16 = 15 |
0 | 0 |
5 | 5 |
2.20
$$
T2U_w (x) = \begin{cases}
x + 2 ^ w & x < 0 \\
x & x \geq 0
\end{cases}
$$
2.21
exp | type | val |
---|---|---|
-2147483647-1 == 2147483648U | unsigned | 1 |
-2147483647-1 < 2147483647 | signed | 1 |
-2147483647-1U < 2147483647 | unsigned | 0 |
-2147483647-1 < -2147483647 | signed | 1 |
-2147483647-1U < -2147483647 | unsigned | 0 |
最后一项错误,应该为 1
,因为左右两边等于都加上 2147483648
2.22
略
2.23
int fun1(unsigned word) {
return (int) ((word << 24) >> 24)
}
int fun2(unsigned word) {
return ((int) word << 24) >> 24;
}
A.
w |
fun1(w) |
fun2(w) |
---|---|---|
0x00000076 | 0x76 | 0x76 |
0x87654321 | 0x21 | 0x21 |
0x000000C9 | 0xC9 | 0xFFFFFFC9 |
0xEDCBA987 | 0x87 | 0xFFFFFF87 |
2.24
unsigned dec | unsigned crop | two's dec | two's crop |
---|---|---|---|
0 | 0 | 0 | 0 |
2 | 2 | 2 | 2 |
9 | 1 | -7 | 1 |
11 | 3 | -5 | 3 |
15 | 7 | -1 | -1 |
2.25
length
的类型是 unsigned
, 对 length - 1
则就变成了 length + T2U(-1)
。在转换之后 length - 1
就变成了 UMax
,不仅可以访问数组内的任何元素,还可以越界访问,超过数组的大小后就会造成越界。
修改:i <= length - 1
=> i < length
2.26
当字符串 t
比字符串 s
更长时,strlen(s) - strlen(t)
是无符号数,此时会负数根据补码还是正的,所以不正确。
修改:strlen(s) > strlen(t)