实验目的与要求

  1. 了解各种数据类型在计算机中的表示方法
  2. 掌握C语言数据类型的位级表示及操作

方法、步骤

  1. 安装gcc-multilib:

或者:

 

2、根据bits.c中的要求补全以下的函数:

intbitXor(int x, int y);

inttmin(void);

intisTmax(int x);

ntallOddBits(int x);

int negate(int x);

intisAsciiDigit(int x);

int conditional(int x, int y, int z);

intisLessOrEqual(int x, int y);

intlogicalNeg(int x);

inthowManyBits(int x);

unsignedfloat_twice(unsigned uf);

unsigned float_i2f(int x);

int float_f2i(unsigned uf);

3、在Linux下测试以上函数是否正确,指令如下:

*编译:./dlc bits.c

*测试:make btest

./btest

实验过程及内容

1.打开虚拟机,打开输入su后输入apt-get install gcc-multilib成功安装

2.编写函数

(1)bitXor 函数

*   仅允许使用~和&来实现异或

  *   例子: bitXor(4, 5) = 1

  *   允许的操作符: ~ &

  *   最多操作符数目: 14

  *   分值: 1

由异或运算的定义和德摩根定律可得

(2)tmin函数

*  返回最小的二进制补码

  *   允许的操作符: ! ~ & ^ | + << >>

  *   最多操作符数目: 4

  *   分值: 1

对于32位整数来说,最小值是2-31,即为0x 8000 0000,则将1左移31位。

(3)isTmax函数

*   isTmax - 如果x是最大的二进制补码,返回1;否则,返回0

  *   允许的操作符: ! ~ & ^ | +

  *   最多操作符数目: 10

  *   分值: 2

寻找补码最大值特点,补码最大值为0111…1,补码最大值+1为1000…,两个值每位都是相异的,其异或结果再取反应为;特殊情况当x=0xffffffff时也满足上述条件,故要做特判:x+1应该不为0。

(4)allOddBits函数

*  allOddBits - 如果所有奇数位都为1则返回1;否则返回0

  *   例子:allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1

*   允许的操作符: ! ~ & ^ | + << >>

  *   最多操作符数目: 12

  *   分值: 2

(5)negate函数

*   negate - 返回-x

  *   例子: negate(1) = -1.

  *   允许的操作符: ! ~ & ^ | + << >>

  *   最多操作符数目: 5

  *   分值: 2

(6)isAsciiDigit函数

*  isAsciiDigit - 如果x是ascii码中的0~9,返回1;否则返回0

  *   例子: isAsciiDigit(0x35) = 1.

  *        isAsciiDigit(0x3a) = 0.

  *        isAsciiDigit(0x05) = 0.

  *   允许的操作符: ! ~ & ^ | + << >>

  *   最多操作符数目: 15

  *   分值: 3

(7)conditional函数

*   conditional - 实现x?y:z

  *   例子: conditional(2,4,5) = 4

  *   允许的操作符: ! ~ & ^ | + << >>

  *   最多操作符数目: 16

  *   分值: 3

(8)isLessOrEqual函数

*   isLessOrEqual - 如果x<=y返回1否则返回0

  *   例子: isLessOrEqual(4,5) = 1.

  *   允许的操作符: ! ~ & ^ | + << >>

  *   最多操作符数目: 24

  *   分值: 3

(9)logicalNeg函数

*   logicalNeg - 实现!运算符的功能

  *   例子: logicalNeg(3) = 0, logicalNeg(0) = 1

  *   允许的操作符: ~ & ^ | + << >>

  *   最多操作符数目: 12

  *   分值: 4

(10)howManyBits函数

*  howManyBits - 返回将X表示为补码所需的最小有效位数。

  *  例子: howManyBits(12) = 5

  *       howManyBits(298) = 10

  *       howManyBits(-5) = 4

  *       howManyBits(0)  = 1

  *       howManyBits(-1) = 1

  *       howManyBits(0x80000000) = 32

  *  允许的操作符: ! ~ & ^ | + << >>

  *  最多操作符数目: 90

*  分值: 4

(11)float_twice函数

*   float_twice - 以unsinged表示的浮点数二进制的二倍的二进制unsigned型

  *   参数和结果都会被作为unsigned返回,但是会表示为二进制的单精度浮点值。

  *   允许的操作符: 任何整数或者无符号数操作符包括: ||, &&. also if, while

  *   最多操作符数目: 30

  *   分值: 4

(12)float_i2f函数

*   float_i2f - 返回int x的unsigned浮点数的二进制形式

  *   参数和结果都会被作为unsigned返回,但是会表示为二进制的单精度浮点值

  *   允许的操作符: 任何整数或者无符号数操作符包括: ||, &&. also if, while

  *   最多操作符数目: 30

  *   分值: 4

(13)float_f2i函数

*  float_f2i - 返回unsigned uf的整型数的二进制形式

  *   参数和结果都会被作为unsigned返回,但是会表示为二进制的单精度浮点值

  *   任何超过范围的数都应该返回 0x80000000u.

  *   允许的操作符: 任何整数或者无符号数操作符包括: ||, &&. also if, while

  *   最多操作符数目: 30

  *   分值: 4

3.编译运行代码,得到最终分数

实验结论

位操作运算比高级语言的运算要更为抽象,难理解,需要注意很多细节以及底层运算逻辑。

通过移位以及异或等操作,可以实现各种运算。

五、实验总结与体会

在实验中也有遇到不少问题,需要注意一些细节,比如特殊情况等等,如果忽视的话很容易出错。

(by 归忆)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐