CSE 351 Lab 1 Helper Worksheet

华盛顿大学的 CSE 351 课程 The Hardware / Software Interface https://courses.cs.washington.edu/courses/cse351/17wi/schedule.html ,该课程原来有一个 Coursera 版本,后来 Coursera 平台大升级,导致这门课在 Coursera 看不了。不过还是可以华盛顿大学的网站上找得到对应的课程视频,地址在这里 https://courses.cs.washington.edu/courses/cse351/17wi/videos.html。
该课程的动手操作实验移植于计算机经典书籍《深入理解计算机系统》的实验。
这篇文章提及的练习是第一个实验 Lab1 的预热练习。题目位于 https://courses.cs.washington.edu/courses/cse351/17wi/sections/02/BitOperations.pdf

规则限制

简单介绍一下代码实现的规则

  1. 不允许使用 if,else,以及其他条件语句
  2. == 操作符也不能用
  3. 能使用的操作符会在每题题目中说明

第一题 Bit Extraction

Complete the following function which returns the value (either 0, or 1) of the 19th bit (counting from the least significant bit). Allowed operators: >>, &, |, ~.

解答:
int extract19(int x)
{
return x >> 18 & 0x1;
}
思路:既然是要取出第 19 个位置的 bit ,我们先把这个
bit 叫做 value。那么就先把左边 18 个位置的 bit 都移除掉,由于 int 类型是 signed integers 应该进行算术右移,所以进行一次算术右移操作。这个时候原来的 value 就位于最低位,再来一次 & 0x1操作,把 value 左边的 bit 全部清 0 的同时保留了 value 所在位置的值。

第二题 Subtraction

Complete the following function which returns the value of x - y. Allowed operators: >>, &, |, ~, +.

解答:
int subtract(int x,int y)
{
return x + ( (~y) + 1);
}
思路:在 int 的补码表示法中存在这么一个规律 ~x + 1 = -x , 在这题目中 x - y 可以看成 x + (-y), 而 -y 可以这样表示 ~y + 1 。那么 x - y 就可以写成 x + ( (~y) + 1) 。

第三题 Equality

Complete the following function which returns the value of x == y. Allowed operators: >>, &, |, ~, +, ^, !.

解答:
int equals(int x, int y)
{
return !( x ^ y);
}
思路:
要判断 x 和 y 相等,那么可以转化为 判断 x 的二进制表示 和 y 的二进制表示一致,^ 操作符在判断二进制位一致的话取 0 ,不一致的话取 1 。那么若是 x 与 y 相等,那么 x ^ y 的结果应该是 0 ,再对结果取反则达到判断目的。

第四题 Greater than zero?

Complete the following function which returns the value of x > 0. Allowed operators: >>, &, |, ~, +, ^, !.
解答:
int greater_than_0(int x)
{
return (~(x >> 31)) & 0x01 & (~x +1) >> 31;
}
思路:
这个题目有 2 个判断,第一个判断是为正数,第二个判断是不能等于 0。如果判断一个数为正数呢?只要判断该数的二进制表示的符号位是否为 0 。符号位若是为 0,那么就可以知道该数是正的,符号位若是为 1,那么该数就是负数。那么我们对第一个判断的实现结果是 ~(x >> 31) & ox01。
接下来开始实现第二个判断即 " 在正数的基础上还要判断该数不等于 0 "。从有符号数的补码可以知道,+0 和 -0 只有一个补码表示方案 -- 0000, 其他数字 -1 的补码表示方案 -- 1111, 1的补码表示方案 - 0001。
那么我们能不能利用这个特性来解决 “正数的基础上还要判断该数不等于 0” 这个问题呢?

  1. 若是 x = 0 ,在第一个判断 ~(x >> 31) & 0x01 为 1 的条件下,我们增加一个判断让整个表达式的值为 0
  2. 若是 x > 0 ,在第一个判断 ~(x >> 31) & 0x01 为 1 的条件下,我们增加一个判断让整个表达式的值为 1
  3. 若是 x < 0 ,在第一个判断 ~(x >> 31) & 0x01 为 0 的条件下,我们增加一个判断让整个表达式的值为 1

这个时候我们可以从补码 ~x +1 = -x 这个规律中得到启发,我们增加 (~x +1) >> 31 这个条件来解决上述的3个问题。
最后的结果是 (~(x >> 31)) & 0x01 & (~x +1) >> 31 。

参考

  1. 华盛顿大学的 CSE 351 课程 The Hardware / Software Interface
    https://courses.cs.washington.edu/courses/cse351/17wi/videos.html

你可能感兴趣的:(CSE 351 Lab 1 Helper Worksheet)