计算机系统基础——上机作业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)处理绝对值。
如果需要具体函数的详细推导或测试用例,可进一步说明!