计算机系统基础——上机作业3
以下是针对表1和表2中所有函数的实现和验证分析,严格按照约束条件和操作符数量限制设计:
表1 位操作函数实现
1. lsbZero (将x的最低有效位清零)
1 | int lsbZero(int x) { |
验证:
x = 0x05 (0b101) → 0x04 (0b100)
2. byteNot (将x的第n个字节取反)
1 | int byteNot(int x, int n) { |
验证:
x = 0x12345678, n=1 → 0x1234A978(第1字节
0x56 取反为 0xA9)
3. byteXor (比较x和y的第n个字节)
1 | int byteXor(int x, int y, int n) { |
验证:
x=0x12345678, y=0x12745678, n=2 → 1(第2字节
0x34 vs 0x74)
4. logicalAnd (模拟x && y)
1 | int logicalAnd(int x, int y) { |
验证:
x=0, y=5 → 0;x=1, y=2 →
1
5. logicalOr (模拟x || y)
1 | int logicalOr(int x, int y) { |
验证:
x=0, y=0 → 0;x=0, y=1 →
1
6. rotateLeft (循环左移n位)
1 | int rotateLeft(int x, int n) { |
验证:
x=0x12345678, n=4 →
0x23456781(左移4位,高位循环到低位)
7. parityCheck (奇偶校验)
1 | int parityCheck(int x) { |
验证:
x=0b1010 →
0(2个1,偶数);x=0b101 →
1(奇数)
表2 补码运算函数实现
**8. mul2OK (判断2*x是否溢出)**
1 | int mul2OK(int x) { |
验证:
x=0x40000000 →
0(溢出);x=0x3FFFFFFF → 1
**9. mult3div2 (计算(x*3)/2)**
1 | int mult3div2(int x) { |
验证:
x=-3 → (-9)/2 = -4(向零取整)
10. subOK (判断x - y是否溢出)
1 | int subOK(int x, int y) { |
验证:
x=0x80000000, y=1 → 0(溢出)
11. absVal (求绝对值)
1 | int absVal(int x) { |
验证:
x=-5 → 5;x=3 →
3
验证方法
- 编写测试代码:为每个函数设计边界值(如0、最大值、最小值)。
- 反汇编分析:使用
objdump -d检查生成的机器码是否符合操作符限制。 - 覆盖率测试:确保所有分支条件被触发(如正负数、溢出情况)。
关键技巧
- 位掩码:使用
0xFF、0x80000000等构造特定模式。 - 符号位操作:通过
x >> 31提取符号位。 - 逻辑运算替代:用
!!x将非零值转换为1,用x ^ (x >> 31)处理绝对值。
如果需要具体函数的详细推导或测试用例,可进一步说明!