Lab1:使用C语言进行位操作
概述
本任务的目的是为了使大家更加熟悉以位级呈现的数据。你会依靠解决一系列谜题来达到这一目的。大多数的谜题看似是有意人为的,但实际上位操作在密码学,数据编码,实现文件格式(如MP3)等非常有帮助。在你解决这些问题的过程中,你将会渐渐熟悉位级别的数据呈现,而且很可能会感受到某种乐趣。同时你也要做某些基本的指针处理以及指针算数。
指导
源码文件: lab1.tar
位谜题
这一节将描述你将要在bits.c内解决的谜题。更完整的文档可在源文件内找到。
位处理
下列表格是你将完成的一系列函数,其难易程度反映在其分值多少中。
更多内容详见源码。
分值 | 函数名 | 描述 | 提示 |
---|---|---|---|
1 | bitAnd | 实现逻辑与 | 德摩根律 |
1 | bitXor | 实现异或 | 德摩根律 |
1 | thirdBits | 返回一个int每3位置1 | 返回值是32位的 |
2 | getByte | 提取x的第n位 | byte是8位宽的 |
3 | logicalShift | x右移n位 | ‘逻辑’移位 |
3 | invert | 将p位开始的n位反相 | 使用mask |
4 | bang | 实现!x不用! | 0为假,其他为真 |
附加题 | |||
3 | conditional | x ? y : z |
2的补运算
分值 | 函数名 | 描述 | 提示 |
---|---|---|---|
2 | fitsBits | 判断x是否能表示为n位补数 | -1=~0 |
2 | sign | 正:1 零:0 负:-1 | 位移 |
3 | addOk | 确定是否溢出 | 考虑正负加法时的情形 |
附加题 | |||
4 | isPower2 | 判断x是否为2的幂 |
检验你的结果
在源文件包中已有两个工具来检验你答案的正确性
dlc是一个用来检验结果是否符合既定规则的程序。用法为
$ ./dlc bits.c
…
btest是一个用来检查代码功能正确性的程序,用法为
$ make
$ ./btest
…
详细内容见源码的README
使用指针
详细介绍见pointer.c文档
指针运算
pointer.c 的头三个函数要求你计算不同数据元素的大小(bytes)。
使用指针处理数据
changeValue 函数要求你只用数组开始地址来改变数组内一元素的值。在源码内不能使用[]!
指针和地址区域
最后两个函数要求你确定指针是否位于特定的地址区域。
检验你的结果
对pointer.c 我们也有一个简单的测试程序:ptest.c,使用如下
$ make ptest
$ ./ptest